在Windows下可以使用select函数,用于在接收网络数据之前先检查是否有数据可读,从而避免阻塞。
#include <winsock2.h>
#include <stdio.h>
int main()
{
// 初始化 Winsock
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建socket
SOCKET sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// ... 设置 sockfd 的相关参数
// 声明并初始化 fd_set
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(sockfd, &readSet);
// 设置超时时间为0,即立即返回
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
// 调用 select 函数进行检查
int ret = select(0, &readSet, NULL, NULL, &timeout);
if (ret > 0 && FD_ISSET(sockfd, &readSet))
{
// 可以接收数据,调用 recv 函数
char buffer[1024];
int bytesReceived = recv(sockfd, buffer, sizeof(buffer), 0);
// 处理接收到的数据
}
else if (ret == 0)
{
// 没有数据可读
}
else
{
// select 调用出错
}
// 关闭socket
closesocket(sockfd);
// 清理 Winsock
WSACleanup();
return 0;
}
#include <winsock2.h>
#include <stdio.h>
int main()
{
// 初始化 Winsock
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建socket
SOCKET sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// ... 设置 sockfd 的相关参数
// 声明并初始化 fd_set
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(sockfd, &readSet);
// 设置超时时间为0,即立即返回
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
// 调用 select 函数进行检查
int ret = select(0, &readSet, NULL, NULL, &timeout);
if (ret > 0 && FD_ISSET(sockfd, &readSet))
{
// 可以接收数据,调用 recv 函数
char buffer[1024];
int bytesReceived = recv(sockfd, buffer, sizeof(buffer), 0);
// 处理接收到的数据
}
else if (ret == 0)
{
// 没有数据可读
}
else
{
// select 调用出错
}
// 关闭socket
closesocket(sockfd);
// 清理 Winsock
WSACleanup();
return 0;
}
展开
1
3