如何解决WSAEWOULDBLOCK错误

时间:2013-01-27 10:15:08

标签: c++ windows sockets

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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