result = ::send(s, buf, length, flag)
最终会发送多少数据?当我得到result == SOCKET_ERROR和WSAGetLastError () == WSA_IO_PENDING时,最终会发送length字节的buf吗?
还是我需要重新发送相同的buf数据?
另一方面,
WSA_IO_PENDING 重叠操作将于稍后完成。 应用程序已启动重叠操作,无法立即完成。当手术完成后,我们会在稍后作出完成指示。
在我看来,发送操作将在稍后完成.
更新:进一步的问题被问到这里,因阻塞(重叠I/O) Winsock2调用而挂起
发布于 2018-08-09 09:31:52
在您链接的文档页面中:
如果没有发生错误,send将返回发送的字节总数,该字节数可以小于len参数中请求发送的字节数。否则,返回SOCKET_ERROR的值。
也就是说,如果是result == SOCKET_ERROR,那么什么也不发送。
至于WSA_IO_PENDING,如果您使用异步文件(例如WSASend ),则可能会发生这种情况。在这种情况下,实际发送的字节数量需要稍后检索,可能需要使用io完成例程。
发布于 2018-09-18 13:34:57
经过一些研究和实验..。以下是一些事实。
*插座将启用隐式重叠属性。
套接字可以通过*WSASocket或通过塞索克托特 / OPENTYPE创建w/o重叠属性*WSASocket,但是超时特性(例如SO_RCVTIMEO)需要重叠属性。
当使用*发送 *反腐败局时,WSA_IO_PENDING错误是可能的,应该使用WSAGetOverlappedResult来处理(我从Windows10开始就观察到了这种行为)。
或者,使用::WSARecv或::WSASend。
还有一些未解决的问题:
更新:进一步的问题被问到这里,因阻塞(重叠I/O) Winsock2调用而挂起
https://stackoverflow.com/questions/51763378
复制相似问题