如何解决WSAE将阻止错误

how to resolve WSAEWOULDBLOCK error

本文关键字:错误 WSAE 何解决 解决      更新时间:2023-10-16

我有一个win7应用程序,我正在TCP连接上发送数据b\w 2客户端。在测试时,我发现我的套接字经常出现WSAEWOULDBLOCK错误。自解决此错误,我为例如在它周围放置了一个 while 循环。

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

因此,如果我得到error 10035我将重新发送数据。

但是现在我看到这个while循环有时会无限运行,我的应用程序会进入某种死锁状态。我尝试增加插座的大小,但仍然没有用。

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

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

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

注意:我还假设您的代码并不是对socket()的真正调用,而是对发送/recv的调用。