如何从 socket winsock2 获取套接字状态

How to get socket states from socket winsock2

嗨,我是 C++ winsock2 套接字的新手,我已经坚持了一段时间。

如何从作为参数传递的 socket/file 描述符连接、绑定、侦听或关闭套接字。

注意:我想在不尝试 bind/connect/listen/closesocket 的情况下弄清楚套接字状态,因为那样会 return 结果并执行操作。示例:如果我想检查套接字是否连接到服务器,我应该尝试连接并获得我不想要的结果。

我正在努力实现这样的目标。

// Using Winsock2 API.
bool isSocketBound(SOCKET s) {
    // Check if socket is bound without attempting to bind.
    // The code which I'm not able to figure out.
    return isBound;
}

// Same goes for the other functions.

提前致谢。

How do I get if a socket is connected, bound, listening or closed from the socket/file descriptor passed as an argument.

没有单个套接字API来查询SOCKET的当前状态。然而:

  • getsockname()会告诉你socket是否本地绑定。

  • getpeername() 将告诉您套接字是否连接到远程对等点。

  • getsockopt() with the SOL_SOCKET:SO_ACCEPTCONN 选项会告诉您面向连接(即 TCP)SOCKET 是否 listen()

    或者,如果您尝试在 listen() 的套接字上 connect(),您将收到 WSAEINVAL 错误。如果您尝试在 connect() 的套接字上 listen(),您将收到 WSAEISCONN 错误。

    或者,如果套接字至少在本地绑定,那么您可以使用getsockname()获取其本地IP/port,然后使用GetTcpTable(), GetTcpTable2(), or GetExtendedTcpTable()查找是否[=78] =]是否处于LISTENING状态。

  • 如果一个SOCKET已经在本地关闭了,那么SOCKET是无效的,所以你不能查询任何东西。您可以做的最好的事情就是在使用完后将 SOCKET 设置为 INVALID_SOCKET,然后在需要时检查该条件。另一方面,如果套接字已被远程关闭但尚未在本地关闭,则 SOCKET 仍然有效,但无法查询其关闭状态。知道套接字是否已被对等方关闭的唯一方法是 recv() 操作是否报告收到 0 个字节,或者 send() 操作是否因连接错误而失败,或者您是否正在使用 SOCKET 处于异步模式(WSAAsyncSelect()WSAEventSelect())并收到一个 FD_CLOSE 通知。

Note : I want to figure out the socket state without attempting to bind/connect/listen/closesocket because that will return a result and perform the operation. Example : if I wanted to check whether a socket is connected to a server I should attempt to connect and get the result which I don't want.

您为什么不在自己的代码中简单地跟踪状态?如果你 bind() a SOCKET 并且它成功了,那么你就知道它是本地绑定的。如果你 connect() 并且它成功了,那么你就知道它在本地绑定并连接到远程服务器。您应该在 SOCKET 变量旁边维护一个 state 变量,并随着您对 SOCKET.[=52= 执行的每个状态更改操作更新 state ]