概述
使用:
(1)首先运行服务端,待服务端运行起来;
(2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址;
(3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含(代表需要传输文件的类型)。
例如:E:/Data(D)/Cat_and_Dog/dog.jpg
参考博主:https://blog.csdn.net/sinat_23118323/article/details/71024351
客户端:
#pragma once
#ifndef _TCPSOCKET_H_
#define _TCPSOCKET_H_
#include <WinSock2.h> //windows socket的头文件
#include <Windows.h>
#include <iostream>
#include <thread>
#include <process.h>
#include<mutex>
#include<string>
#include<process.h>
#define err(errMsg) printf("[error] %s failed,code %d
line:%dn",errMsg, WSAGetLastError(),__LINE__)
#pragma comment(lib, "ws2_32.lib") //连接winsock2.h的静态库文件
using namespace std;
class Socket {
private:
SOCKET clientSock;
int id;
string ip;
char wb_file[MAXBYTE];
public:
//获取ClientSock
SOCKET Getcientsock();
//获取当前日期
void OBTION_TIME();
//获取开始时间
double START_TIME();
//获取结束时间
double END_TIME();
//获取文件大小
void getByteSize(unsigned long long size);
//返回以MB为单位的文件大小
unsigned long long RETURN_MB(unsigned long long size);
//判断输入IP是否存在
bool TARGE_FILE(string ip);
//输入文件
void SEND_FILE(string file);
//LPVOID是一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递)
static DWORD WINAPI transmmit(const LPVOID arg);
bool INPUT_IP(string ipt);
//系统的实现以上函数
int MAIN_SOCKET();
//清理和关闭网络库
void CLEAR();
};
//定义结构体用来设置
typedef struct my_file
{
SOCKET clientSocket; //文件内部包含了一个SOCKET 用于和客户端进行通信
sockaddr_in clientAddr; //用于保存客户端的socket地址
int id; //文件块的序号
}F;
#endif // !_TCPSOCKET_H_
#include "tcpSocket.h"
#define MAXBYTES 300*1024
//表示一秒钟会有多少个时钟计时单元
#define CLOCKS_PER_SEC ((clock_t)1000)
mutex m;
//获取当前日期
void Socket::OBTION_TIME() {
SYSTEMTIME start; //windows.h中
GetLocalTime(&start);//time.h的tm结构体一样的效果
cout << start.wYear << "/" << start.wMonth << "/" << start.wDay << " " << start.wHour << ":" << start.wMinute << ":" << start.wSecond << endl;
}
// 获取开始时间
double Socket::START_TIME() {
DWORD start_time;
start_time = GetTickCount64();
return (double)start_time;
}
//获取结束时间
double Socket::END_TIME() {
DWORD end_time;
end_time = GetTickCount64();
return double(end_time);
}
SOCKET Socket::Getcientsock() {
return clientSock;
}
//获取文件大小
void Socket::getByteSize(unsigned long long size) {
unsigned long long rest = 0;
if (size < 1024) {
cout << size << "B" << endl;
return;
}
else {
size /= 1024;
}
if (size < 1024) {
cout << size << "KB" << endl;
return;
}
else {
rest = size % 1024;
size /= 1024;
}
if (size < 1024) {
size *= 100;
cout << (size / 100) << "." << (rest * 100 / 1024 % 100) << "MB" << endl;
return;
}
else {
size = size * 100 / 1024;
cout << (size / 100) << "." << (size % 100) << "GB" << endl;
return;
}
}
void Socket::SEND_FILE(string file) {
int i = 0;
char Temporary_file[MAXBYTE] = { 0 };//保存发送文件的格式
for (i = 0; i < file.length(); i++) {
wb_file[i] = file[i];
Temporary_file[i] = file[i];
}
wb_file[i] = '