处理winsock 10004错误的最佳方法

时间:2014-10-10 20:41:38

标签: visual-c++ winsock

我正在创建多个套接字以在客户端上发送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());
}

1 个答案:

答案 0 :(得分:0)

不要同时使用多个线程从单个套接字读取。不要使用线程来处理超时。你需要的只是一个简单的循环,也许是一个计时器。要解决阻止问题,请将套接字置于非阻止模式,或者使用select()超时,以便知道何时可以安全地无阻塞地呼叫recvfrom(),或使用setsockopt(SOL_SOCKET, SO_RCVTIMEO)阻止读取设置超时。