在Windows上设置来自套接字的recv超时
Set a timeout for recv from socket on Windows
Ih,我认为我的代码是正确的,但它不起作用:(
要在windows上设置recv功能的超时,我知道我必须使用以下代码:
DWORD timeout = 2000;
if (setsockopt(listenSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(DWORD)))
{ perror("setsockopt");
return -1;
}
但它不起作用。
我的服务器代码是:
SOCKET listenSocket;
SOCKET remoteSocket= INVALID_SOCKET;
SOCKADDR_IN Server_addr;
SOCKADDR_IN Client_addr;
int sin_size;
short port;
int wsastartup;
int ls_result;
WORD wVersionRequested = 0x0202;
WSADATA wsaData;
wsastartup = WSAStartup(wVersionRequested, &wsaData);
if (wsastartup != NO_ERROR) cout << "Errore WSAStartup()" << endl;
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
port = 4000;
Server_addr.sin_family = AF_INET;
Server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
Server_addr.sin_port = htons(port);
if (bind(listenSocket,(LPSOCKADDR) &Server_addr,sizeof(struct sockaddr)) < 0) {
cout << "Server: error bind." << endl;
closesocket(listenSocket);
return -1;
}
ls_result = listen(listenSocket, SOMAXCONN);
sin_size = sizeof(struct sockaddr_in);
remoteSocket = accept(listenSocket, (struct sockaddr *) &Client_addr, &sin_size);
// SET THE TIME OUT
DWORD timeout = 300;
if (setsockopt(remoteSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(DWORD)))
{ perror("setsockopt");
return -1;
}
int i=0;
while (i<50){
t_start = clock();
// when client receives the send below it wait 3 seconds and then trasmits the answer
send(remoteSocket, "code of start transmission", sizeof("code of start transmission"), 0);
recv_size=recv(remoteSocket, messaggio, sizeof(messaggio), 0);
printf("time for read= %f second n", ((double)(end - t_start)) / CLOCKS_PER_SEC);
i=i+1;
}
客户端收到来自服务器的消息"开始传输代码"时,等待3秒,然后切换到服务器。我期望读取时间为300毫秒,并且recv_size<0,而不是recv_size<0,但读取时间大约为1.5秒(服务器等待客户端的消息(。我不明白为什么。
我在windows上,使用eclipse和mingw-w64。
有人能帮我吗??
您的代码在套接字超时后尝试使用它。这不是一个好主意,因为套接字仍然处于失败的阻塞操作的中间位置,并且没有启动新操作的形状。无法展开之前已完成的操作部分,也无法将套接字放回操作开始前的位置。
一旦阻塞套接字操作超时,您所能安全地做的就是关闭套接字。不支持撤消部分完成的操作并使套接字处于任何正常状态。
如果套接字上的发送或接收操作超时,则套接字状态是不确定的,不应使用[.]-MSDN
SO_RCVTIMEO套接字选项不应用于设计用于套接字的代码中。这是为了防止代码中的无限等待,而这些代码并不是为本机使用套接字而设计的。这些不是你要找的机器人。
要在windows上设置recv功能的超时,我知道我必须使用以下代码:
DWORD timeout = 2000;
if (setsockopt(listenSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(DWORD)))
{ perror("setsockopt");
return -1;
}
没有。它应该是int
,而不是DWORD
,但主要问题是您在这里设置了accept()
超时,因为这是侦听套接字。您需要将其设置在已接受的套接字上。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 为什么套接字中的 recv() 函数不返回任何内容?
- TCP套接字(客户端-服务器)recv()返回-1值
- C++中TCP套接字的recv函数
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- Linux 套接字 recv 返回 -1,errno 110 连接超时
- 如何使用 recv 或 C++ 中的读取功能从 tcp 套接字读取大请求
- Unix 套接字挂在 recv 上,直到我在任何地方放置/删除断点
- send()和recv()套接字参数
- recv套接字中的前几个字节,以确定缓冲区大小
- 是否可以将套接字设置为仅针对recv()函数的非阻塞套接字
- setsockopt() 在设置大套接字 recv 缓冲区时不返回错误
- c++中的套接字recv
- 由于PROTOBUF服务器中的字符串数据类型变量和客户端通过cpp中recv端的套接字进行通信,因此正在获取segfau
- 套接字recv(),每次一个字节
- 关于c++中的套接字recv和char[]
- 当套接字 recv() 然后使用 overlapped_io 和 FILE_NO_BUFFERING_FLAG 写入文件