#第一步链接库
qmake:LIBS += -lws2_32
cmake:target_link_libraries( send(send是项目名称替换自己的) PUBLIC $<$<BOOL:${MINGW}>:ws2_32>)(实测有效)(注意是MINGW平台)
在还有就是在文件开头加入
#pragma comment(lib, "ws2_32.lib")
也行
#加入头文件
include <WinSock2.h>
#编写代码
调用WSAStartup,初始化套接字
发送
//定义变量
SOCKET msocket;
sockaddr_in server_addr;
WORD sockVerson = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVerson, &wsaData))
{
qDebug() << "初始化WinSock失败";
}
msocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (msocket == INVALID_SOCKET)
{
qDebug() << "套接字创建失败";
WSACleanup();
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port.toUShort()); // 服务器侦听的端口号
server_addr.sin_addr.S_un.S_addr = inet_addr(server_ip.toStdString().c_str()); // 服务器IP地址
int result = ::connect(msocket, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (result == SOCKET_ERROR) {
qDebug() << "connect请求连接失败" << WSAGetLastError();
closesocket(msocket);
WSACleanup();
}
else{
qDebug() << "向服务器请求连接成功";
}
//然后开始send
::send(msocket,filehead.data(),filehead.size(),0);
接收
//定义变量
SOCKET msocket;
sockaddr_in serverAddr;
sockaddr_in clientAddr;
sockaddr_in remoteAddr;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) !=0 )
{
qDebug() << "Failed to initiate Winsock.";
}
msocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (msocket == INVALID_SOCKET)
{
qDebug() << "Failed to create socket.";
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port.toUShort()); // 服务器侦听的端口号
serverAddr.sin_addr.S_un.S_addr = inet_addr(ip.toStdString().c_str()); // 服务器IP地址
if (bind(msocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) //(SOCKADDR*)
{
qDebug() << "socket绑定失败";
closesocket(msocket);
}
//3.监听套接字
listen(msocket, 5);
//4.等待客户端的连接
int clientAddrsize = sizeof(clientAddr);
qDebug() << "等待客户端登录";
int revSocket = accept(msocket, (SOCKADDR*)&clientAddr, &clientAddrsize);//等待客户端接入,直到有客户端连接上来为止
if (revSocket == INVALID_SOCKET)
{
qDebug() << "服务器循环接收请求失败:\n" << WSAGetLastError();
closesocket(msocket);
WSACleanup();
}
else
{
qDebug() << "客服端与服务器建立连接成功:%s \n";
}
//int nRecvBuf=1024*8*10000;
//int nTimeout = 1000;
//setsockopt(msocket,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//setsockopt(msocket,SOL_SOCKET,SO_RCVTIMEO,(const char *)&nTimeout, sizeof(int));
//5.收
while(!stop1)
{
arry.resize(8192);
int i = recv(revSocket, arry.data(), 8192, 0);
}
注意读取的时候,一定是recv,accept返回的句柄,在这个句柄里才能读到发送的数据,尼玛读半天读不到数据,一直是-1。