如何解决 WSAEWOULDBLOCK 错误
Posted
技术标签:
【中文标题】如何解决 WSAEWOULDBLOCK 错误【英文标题】:how to resolve WSAEWOULDBLOCK error 【发布时间】:2013-01-27 10:15:07 【问题描述】:我有一个 win7 应用程序,我在其中通过 TCP 连接发送数据 b\w 2 个客户端。在测试时,我发现我的套接字上经常出现WSAEWOULDBLOCK
错误。到
解决这个错误我在它周围放了一个while循环。
do
size_t value = ::send(); /*with proper arguments*/
while(GetLastError() == 10035);
因此,如果我收到error 10035
,我将重新发送数据。
但现在我看到这个 while 循环有时会无限运行,我的应用程序会运行 进入一种死锁状态。我尝试增加套接字的大小,但仍然没有用。
如果有人知道如何解决WSAEWOULDBLOCK
错误,请告诉我。
【问题讨论】:
size_t value = socket();
这是什么?在套接字创建期间你得到WSAEWOULDBLOCK
吗?如果没有,您是否使用非阻塞模式(如果使用,为什么?)?
你不需要无限循环。相反,您可能需要套接字事件,当套接字准备好发送时,您会收到通知。
您的意思是send()
而不是socket()
? (使用适当的参数)
为什么不知道怎么用非阻塞模式?我只会使用阻塞模式,除非你知道你需要非阻塞,在这种情况下你当然应该学习如何使用 select()。
【参考方案1】:
WSAEWOULDBLOCK 并不是真正的错误,它只是告诉您发送缓冲区已满。如果您使网络饱和或对方根本不确认接收到的数据,则可能会发生这种情况。看一下 select() 函数,它允许您等到缓冲区空间可用或发生超时。还有一种方法可以将 win32 事件绑定到流,然后允许它与 WaitForMultipleObjects 一起使用,以防您想提前中止等待。
顺便说一句:我最初想反对您使用“死锁”一词,但这也是可能发生的事情:如果您在收到下一个请求之前等待发送一些响应,而另一方想要发送下一个请求而不是接收您的响应,您的应用程序实际上陷入僵局。使用 select(),您可以确定是否可以发送数据、接收数据或连接失败,这使您可以正确处理这些情况以及何时发生。
注意:我还假设您的代码实际上不是对 socket() 的调用,而是对发送/接收的调用。
【讨论】:
如果对端读取速度不如您写入速度,也会发生这种情况。 感谢您的帮助。我刚刚在套接字上发送数据之前使用了 select ,我知道它工作正常。以上是关于如何解决 WSAEWOULDBLOCK 错误的主要内容,如果未能解决你的问题,请参考以下文章