c++ - 如何解决 WSAEWOULDBLOCK 错误

标签 c++ windows sockets

我有一个 win7 应用程序,我在其中通过 TCP 连接向 2 个客户端发送数据。在测试时,我发现我的套接字上经常出现 WSAEWOULDBLOCK 错误。到 解决这个错误我在它周围放了一个 while 循环 for ex。

do  
{  
size_t value = ::send();  /*with proper arguments*/
}while(GetLastError() == 10035);

因此,如果我收到错误 10035,我将重新发送数据。

但现在我看到这个 while 循环有时会无限运行,我的应用程序运行 进入一种僵局状态。我尝试增加套接字的大小,但仍然没有用。

如果有人知道如何解决 WSAEWOULDBLOCK 错误,请告诉我。

最佳答案

WSAEWOULDBLOCK 并不是真正的错误,而只是告诉您发送缓冲区已满。如果您使网络饱和或另一方根本不确认收到的数据,就会发生这种情况。查看 select() 函数,它允许您等待直到缓冲区空间可用或发生超时。还有一种方法可以将 win32 事件绑定(bind)到流,然后允许它与 WaitForMultipleObjects 一起使用,以防您想提前中止等待。

顺便说一句:我最初想反对你使用术语“死锁”,但这也是可能发生的事情:如果你在收到下一个请求之前等待发送一些响应,而另一方想要发送下一个请求而不是接收您的响应,您的应用程序实际上陷入僵局。使用 select(),您可以确定是否可以发送数据、接收数据或连接失败,这使您可以正确处理这些情况以及它们何时发生。

注意:我还假设您的代码实际上并不是对 socket() 的调用,而是对发送/接收的调用。

关于c++ - 如何解决 WSAEWOULDBLOCK 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546362/

相关文章:

java - 无法在套接字列表循环中获取套接字的 DataOutputStream

python - 使用带有 zmq 和 python 的套接字通过 send_json 发送整数列表时出现奇怪的错误

c++ - 在 C++ 中,指针是否保证在 `delete` 之后保留其值?

windows - 运行 Cargo 时找不到 EtwGetTraceLoggerHandle

c++ - 良好的编程实践与临时编程的速度

python - pyttsx3初始化错误,不能使用pyttsx3

Windows 虚拟地址空间

java - HTTPS 套接字 "javax.net.ssl.SSLHandshakeException: no cipher suites in common"

c++ - 是否使用 auto 声明变量并使用原始文字定义的行为进行初始化?

c++ - 命名?模板、函数中的参数