windows 下TCP通信,采用多线程,server和client可以自由的发送和接受消息。同时client可以进行文件的下载,纯c++代码
//client
#include<winsock2.h>
#include<iostream>
#include<string>
#include<thread>
#include <fstream>
#define MAX_BUF 8*1024
using namespace std;
#pragma comment(lib,"ws2_32.lib")
enum MSG_TYPE {
DOWNLOAD_START,
DOWNLOAD_SURE,
DOWNLOAD_END,
DOWNLOAD,
DOWNLOAD_STOP,
};
SOCKET sock=-1;
fstream *outfile=nullptr;
bool ConnectServer();
bool SendPacket(long type = DOWNLOAD, string packet = "");
void ReceiveMsgJudge(string buf);
void RecvData();
void Run();
void DownloadStart(string _name,long long speeh=100*1024);//speeh is 100k
void Downloading(string data);
void DownloadEnd();
int main(){
thread RecvThread(RecvData);
RecvThread.detach();
thread SendThread(Run);
SendThread.join();
return 0;
}
bool ConnectServer(){
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)return false;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
cout << "Socket error" << endl;
WSACleanup();
return false;
}
sockaddr_in sock_in;
sock_in.sin_family = AF_INET;
sock_in.sin_port = htons(8888);
sock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(sock, (sockaddr*)&sock_in, sizeof(sock_in)) == SOCKET_ERROR) {
cout << "Connect error" << endl;
WSACleanup();
return false;
}
std::cout<<"connect succeed :\t"<<std::endl;
return true;
}
bool SendPacket(long type, string packet) {
long len = packet.size() + sizeof(type);
char *sendBuf = new char[len];
memset(sendBuf, 0, len);
memcpy(sendBuf, &type, sizeof(long));
memcpy(sendBuf + sizeof(type), packet.c_str(), packet.size());
send(sock