处理套接字的WSA_IO_PENDING ::发送

handling WSA_IO_PENDING for socket ::send

本文关键字:套接字 发送 PENDING IO WSA 处理      更新时间:2023-10-16

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

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

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

另一方面

WSA_IO_PENDING

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

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

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

更新:进一步的问题在这里问 阻塞(重叠的 I/O(Winsock2 调用引起的意外WSA_IO_PENDING

从您链接的文档页面:

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

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

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

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

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

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

使用 ::send ::recv 时,可能会出现WSA_IO_PENDING错误,应该使用 WSAGetOverlappedResult 来处理(我从 Windows 10 开始观察到这种行为(

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

还有一些问题没有被问到:

更新:进一步的问题在这里问 阻塞(重叠的 I/O(Winsock2 调用引起的意外WSA_IO_PENDING