C++ 处理套接字::send的WSA_IO_挂起
最终将发送多少数据?当我得到C++ 处理套接字::send的WSA_IO_挂起,c++,windows,sockets,winsock2,C++,Windows,Sockets,Winsock2,最终将发送多少数据?当我得到result==SOCKET\u ERROR和WSAGetLastError()==WSA\u IO\u PENDING length字节的buf最终会全部发送吗 或者我需要再次尝试重新发送相同的buf数据 另一方面 WSA_IO_待定 重叠操作将在稍后完成 应用程序已启动无法立即完成的重叠操作。稍后将给出完成指示 操作完成后 在我看来,发送操作将在稍后完成 更新:这里有进一步的问题 从您链接的文档页面: 如果未发生错误,send返回发送的总字节数,该字节数可以小于
result==SOCKET\u ERROR
和WSAGetLastError()==WSA\u IO\u PENDING
length
字节的buf
最终会全部发送吗
或者我需要再次尝试重新发送相同的buf数据
另一方面
WSA_IO_待定
重叠操作将在稍后完成
应用程序已启动无法立即完成的重叠操作。稍后将给出完成指示
操作完成后
在我看来,发送操作将在稍后完成
更新:这里有进一步的问题
从您链接的文档页面: 如果未发生错误,send返回发送的总字节数,该字节数可以小于len参数中请求发送的字节数。否则,将返回SOCKET_ERROR的值 也就是说,如果
result==SOCKET\u ERROR
则不发送任何内容
至于
WSA\u IO\u PENDING
,例如,如果使用异步IO,可能会发生这种情况。在这种情况下,实际发送的字节数需要稍后检索,可能需要使用io完成例程。经过一些研究和实验。。
以下是一些事实
将启用隐式重叠属性
可以通过或通过创建不带重叠属性的套接字,但是超时功能(例如,SO\u RCVTIMEO
)需要重叠属性
当使用WSA_IO_挂起错误时,这是可能的,并且应该用处理(从Windows 10开始我就观察到这种行为)
或者,改为使用::WSARecv或::WSASend
还有一些问题没有解决:
更新:这里有进一步的问题
谢谢WSA_IO_PENDING的文件让我有点紧张confused@rnd_nr_gen请注意,
WSA\u IO\u PENDING
甚至没有列出此函数的可能错误代码。如果使用异步io而不是阻止send
call,则可能会发生这种情况。也就是说,send
不执行重叠操作。这同样适用于::recv
。我确实从::recv获得了WSA_IO_PENDING,即使错误代码也没有列出。(Win 10)@rnd_nr_gen正如VTT所说,send()
和recv()
不执行重叠的I/O,因此它们根本不可能报告WSA IO_PENDING
。如果将套接字置于非阻塞模式,send()
/recv()
可以报告WSAEWOULDBLOCK
,否则它们将以同步模式运行。只有重叠的支持I/O的函数,如WSASend/Ex()
,WSARecv()
,RIOSend/Ex()
,才能报告WSA\u IO\u PENDING
。那么,我为什么从中得到WSA\u IO\u PENDING,这将非常有趣,至少:recv()我在套接字中使用的全部内容是#include、ws2_32.lib、::socket(AF_INET、SOCK_STREAM、IPPROTO_TCP),::WSAIoctl(s、_WSAIOW(IOC_供应商,4),&heartbeat、sizeof(heartbeat)、0、0、&no、0、0)来保持活动状态。和::send(),::recv()在MSVS2015/Win10上您应该使用WSAGetLastError
而不是getLastError
更正。谢谢是打字错误。。。在代码中,它确实是WSAGETLAPTEROR,您不能在send
或recv
之后使用WSAGETOVERLAPPED结果
,原因很简单-此api不会将指针指向WSAOOVERLAPPED
。那么,在callWSAGetOverlappedResult
中,您将使用哪个WSAOVERLAPPED
?这越来越少地是我最初的问题和猜测的假设。默认情况下,“发送”和“接收”阻塞调用可以有重叠的I/O。与使用MSDN中所述的NULL lpOverlapped和NULL lpCompletionRoutine调用“WSASend”和“WSARecv”相同。在这些调用之后,您可能会收到套接字错误,WSA_IO_挂起。对我来说,阻塞调用有这样的错误是非常奇怪的。我应该忽略“错误”,还是通过关闭套接字来处理它??可以使用具有NULL事件句柄的WSAOVERLAPPED调用´WSAGetOverlappedResult´。我可以用它来投票结果吗?我的意思是“WSAGetOverlappedResult”和一个空的WSAOVERLAPPED对象。我希望WinAPI能正确处理这种情况,但是我没有找到任何有信心的参考资料。。。有任何注释吗?我的意思是WSAGetOverlappedResult
带有空的WSAOVERLAPPED
对象-没有。这总是错误的,毫无意义的。在`WSAGetOverlappedResult
中,需要使用io请求中使用的重叠指针。我希望Win API能正确处理这种情况-不可能。指向overlapped的指针是[WSA]GetOverlappedResult
的主要参数-如果不确定-io是否完成,如果完成-使用哪个错误代码,如果没有错误-传输多少字节。所有这些信息都存储在wsaooverlapped
对象中。没有有效对象-将不显示任何内容