如何从 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
]
嗨,我是 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 theSOL_SOCKET:SO_ACCEPTCONN
选项会告诉您面向连接(即 TCP)SOCKET
是否listen()
。或者,如果您尝试在
listen()
的套接字上connect()
,您将收到WSAEINVAL
错误。如果您尝试在connect()
的套接字上listen()
,您将收到WSAEISCONN
错误。或者,如果套接字至少在本地绑定,那么您可以使用
getsockname()
获取其本地IP/port,然后使用GetTcpTable()
,GetTcpTable2()
, orGetExtendedTcpTable()
查找是否[=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
]