result = ::send(s, buf, length, flag)
最终将发送多少数据?当我得到result == SOCKET_ERROR
和WSAGetLastError () == WSA_IO_PENDING
时
最终将发送length
中的buf
个字节吗?
还是我需要再次尝试重新发送相同的buf数据?
另一方面
WSA_IO_PENDING
重叠的操作将在稍后完成。
应用程序启动了无法立即完成的重叠操作。稍后将给出完成指示 当操作完成时......
在我看来,发送操作将在以后完成。...
更新:进一步的问题在这里提出 Unexpected WSA_IO_PENDING from blocking (overlapped I/O) Winsock2 calls
答案 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