【发布时间】:2015-05-09 14:32:03
【问题描述】:
我已经调用了WSARecv(),它返回了WSA_IO_PENDING。然后我从另一端发送了一个RST 数据包。另一个线程中存在的GetQueuedCompletionStatus() 函数按预期返回了FALSE,但是当我调用WSAGetLastError() 时,我得到的是64 而不是WSAECONNRESET。
那么为什么WSAGetLastError() 没有返回WSAECONNRESET?
编辑:
我忘了提到,当我在失败的WSARecv() 之后直接调用WSAGetLastError() 时(因为收到了RST 数据包),返回的错误代码是WSAECONNRESET 而不是64。
所以看起来返回的错误代码取决于WSARecv()是在调用它之后直接失败,还是在稍后检索完成数据包时失败。
【问题讨论】:
-
64 是
ERROR_NETNAME_DELETED。这就是它的工作方式。你将不得不处理它。根据我使用 WinSock IOCP 的经验,它通常会报告ERROR_NETNAME_DELETED而不是WSAECONNRESET,因此只需将这两个错误视为相同即可。 -
@Remy Lebeau 在 IOCP 线程中
WSAGetLastError()返回的所有错误代码是ERROR_NETNAME_DELETED还是只是WSAECONNRESET? -
并非所有错误,但我不知道哪些错误具体映射到
ERROR_NETNAME_DELETED。我总是将其视为意外的断开连接。它是否由RST引起真的很重要吗?这不是一种优雅的断开方式。 -
@Remy Lebeau 在我的情况下这并不重要,但在其他情况下知道断开连接的原因可能很重要。