2

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

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

所以如果我得到error 10035我会重新发送数据。

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

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

4

1 回答 1

9

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

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

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

于 2013-01-27T16:39:18.783 回答