处理套接字:: send的WSA_IO_PENDING

时间:2018-08-09 09:25:47

标签: c++ windows sockets winsock2

result = ::send(s, buf, length, flag)

最终将发送多少数据?当我得到result == SOCKET_ERRORWSAGetLastError () == WSA_IO_PENDING时 最终将发送length中的buf个字节吗?

还是我需要再次尝试重新发送相同的buf数据?

另一方面

  

WSA_IO_PENDING

     

重叠的操作将在稍后完成。

     

应用程序启动了无法立即完成的重叠操作。稍后将给出完成指示   当操作完成时......

在我看来,发送操作将在以后完成。...

  

更新:进一步的问题在这里提出   Unexpected WSA_IO_PENDING from blocking (overlapped I/O) Winsock2 calls

2 个答案:

答案 0 :(得分:1)

在链接的文档页面上:

  

如果未发生错误,则send返回已发送的字节总数,该总数可以小于len参数中请求发送的字节数。否则,返回值SOCKET_ERROR

也就是说,如果result == SOCKET_ERROR,则什么也没有发送。

对于WSA_IO_PENDING,如果您使用的是异步io,例如WSASend,则可能会发生。在这种情况下,可能需要使用io完成例程来稍后检索实际发送的字节数。

答案 1 :(得分:0)

经过一些研究和实验 这是一些事实。

::socket将启用隐式重叠的属性。

可以通过::WSASocket或通过setsocketopt / SO_OPENTYPE创建不带重叠属性WSA_FLAG_OVERLAPPED的套接字,但是需要超时功能(例如SO_RCVTIMEO)重叠的属性。

在使用::send ::recv时,可能会发生WSA_IO_PENDING错误,应通过WSAGetOverlappedResult处理(我从Windows 10开始就观察到这种情况)

或者,改为使用:: WSARecv或:: WSASend。

仍然有未解决的问题:

  

更新:进一步的问题在这里提出   Unexpected WSA_IO_PENDING from blocking (overlapped I/O) Winsock2 calls