Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理套接字::send的WSA_IO_挂起_C++_Windows_Sockets_Winsock2 - Fatal编程技术网

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
。那么,在call
WSAGetOverlappedResult
中,您将使用哪个
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
对象中。没有有效对象-将不显示任何内容