处理 winsock 10004 错误的最佳方法

Posted

技术标签:

【中文标题】处理 winsock 10004 错误的最佳方法【英文标题】:Best way to handle a winsock 10004 error 【发布时间】:2014-10-10 20:41:38 【问题描述】:

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

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

【讨论】:

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

以上是关于处理 winsock 10004 错误的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Paypal API (NVP) TransactionSearch 给出错误 10004 - 开始日期无效

惠普 ALM | REST API 错误 ALM-E10004:加载项目失败?

winsock套接字错误

时钟类错误处理的最佳方法?

处理useMutation钩子中错误的最佳方法是啥[重复]

在 iOS 中处理 https 错误代码的最佳方法是啥?