Visual c++ 处理winsock 10004错误的最佳方法

Visual c++ 处理winsock 10004错误的最佳方法,visual-c++,winsock,Visual C++,Winsock,我正在创建多个套接字以在客户端上发送UDP广播。在客户机上,我还使用阻塞recvfrom()调用来获取应答服务器的IP地址。我决定为每个recvfrom()调用创建一个线程,因为服务器无法回复,这会让我挂起电话。我还创建了另一个线程,以便跟踪时间并退出程序。假设我把时间限制在5秒。我有时会得到错误10004-> 因为我在一个阻塞呼叫中结束程序 您认为只检测是否发生了此特定错误,而不采取任何措施是好的吗。最好的处理方法是什么 即 不要同时使用多个线程读取单个套接字。不要使用线程来处理超时。你所需要

我正在创建多个套接字以在客户端上发送UDP广播。在客户机上,我还使用阻塞recvfrom()调用来获取应答服务器的IP地址。我决定为每个recvfrom()调用创建一个线程,因为服务器无法回复,这会让我挂起电话。我还创建了另一个线程,以便跟踪时间并退出程序。假设我把时间限制在5秒。我有时会得到错误10004->

因为我在一个阻塞呼叫中结束程序

您认为只检测是否发生了此特定错误,而不采取任何措施是好的吗。最好的处理方法是什么


不要同时使用多个线程读取单个套接字。不要使用线程来处理超时。你所需要的只是一个简单的循环,也许是一个计时器。要绕过阻塞问题,请将套接字置于非阻塞模式,或者使用带有超时的
select()
,以了解在不阻塞的情况下调用
recvfrom()
何时是安全的,或者使用
setsockopt(SOL_socket,SO_RCVTIMEO)
设置阻塞读取的超时。

我正在使用线程来recvfrom()多个不同的套接字(根据计算机的接口数量创建)。可以吗?当您建议使用循环或计时器时,我使用线程实现了这一点。你在想什么方法?我将更深入地研究非阻塞模式,因为它似乎是我的最佳选择,但当我尝试它时,我记得遇到了一个错误,并且不太确定如何处理它。非常感谢你的帮助!正如您所说,我最终使用了带有超时的Select(),并使其正常工作,这意味着我不再需要线程计时器/任何计时器!再次感谢你,雷米。
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());
}