我正在创建多个套接字以在客户端上发送UDP广播。在客户端上我也使用阻塞recvfrom()调用来获取回复的服务器的IP地址。我决定为每个recvfrom()调用创建一个线程,因为服务器可能没有回复,这会让我感到不安。我也在创建另一个线程,以便跟踪时间并退出程序。假设我把时间限制为5秒。我有时会得到错误10004 - > http://support.ipswitch.com/kb/WSK-19980714-EM08.htm
原因是我在阻止通话中结束了该程序
你认为只检测这个错误是否发生并且什么都不做是不对的。处理这个问题的最佳方法是什么?
即。
if((recvfrom(socket, (char *)buffer, size, 0, (struct sockaddr *) &fromAddr, &fromAddrLen)) == SOCKET_ERROR)
{
if(WSAGetLastError() == 10004)
//do nothing
else
printf("\nrecvfrom() failed with error code : %d" , WSAGetLastError());
}
答案 0 :(得分:0)
不要同时使用多个线程从单个套接字读取。不要使用线程来处理超时。你需要的只是一个简单的循环,也许是一个计时器。要解决阻止问题,请将套接字置于非阻止模式,或者使用select()
超时,以便知道何时可以安全地无阻塞地呼叫recvfrom()
,或使用setsockopt(SOL_SOCKET, SO_RCVTIMEO)
阻止读取设置超时。