WSASend() 和 WSARecv() 的所有错误代码是不是意味着套接字已断开连接?

Posted

技术标签:

【中文标题】WSASend() 和 WSARecv() 的所有错误代码是不是意味着套接字已断开连接?【英文标题】:Does all error codes of WSASend() and WSARecv() means that the socket has disconnected?WSASend() 和 WSARecv() 的所有错误代码是否意味着套接字已断开连接? 【发布时间】:2015-03-08 11:51:02 【问题描述】:

我需要知道使用IOCP时WSASend()WSARecv()WSA_IO_PENDING除外)的错误码是否意味着socket已经断开。大多数错误代码都很明显,但我不确定以下内容:

WSASend()的错误码:

WSAEINPROGRESS WSAENOBUFS WSA_OPERATION_ABORTED

WSARecv()的错误码:

WSAEFAULT WSAEINPROGRESS

【问题讨论】:

您可能需要检查a list of the Winsock error codes,以及阅读WSASendWSARecv 的引用。 【参考方案1】:

答案

不,并非所有错误代码都是由于套接字断开造成的。


细化

如果不大声喊出“不,请阅读文档!”,我实际上不确定如何回答这个问题。

msdn.microsoft.com - Windows Sockets Error Codes

例如,WSAEINPROGRESS 表示正在进行另一个阻塞操作 - 因此当前的阻塞操作因此被中止。

WSAEINPROGRESS - 10036

操作正在进行中。

当前正在执行阻塞操作。 Windows 套接字仅允许单个阻塞操作(每个任务或线程)处于未完成状态,并且如果进行了任何其他函数调用(无论它是否引用该套接字或任何其他套接字),该函数都会失败并出现 WSAEINPROGRESS 错误。

【讨论】:

反对者能否澄清这个答案有什么问题? OP 明确表示,他想知道是否所有相关错误代码都表示套接字已断开连接;手册(和这个答案)明确指出事实并非如此。

以上是关于WSASend() 和 WSARecv() 的所有错误代码是不是意味着套接字已断开连接?的主要内容,如果未能解决你的问题,请参考以下文章

我应该为 WSASend 和 WSARecv 使用不同的 WSAOVERLAPPED 结构吗?

io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend

如何知道完成数据包是针对 WSASend() 还是 WSARecv() 还是 AcceptEx()?

WSARecv 钩子:防止数据包被可执行文件接收

socket 怎么检测连接是不是断开?

我应该处理 WSASend() 可能不会发送所有数据的事实吗?