Visual c++ 如何从套接字winsock2获取套接字状态
如何从作为参数传递的套接字/文件描述符获取套接字是否已连接、绑定、侦听或关闭 注意:我想在不尝试绑定/connect/listen/closesocket的情况下计算套接字状态,因为这将返回一个结果并执行操作。示例:如果我想检查套接字是否连接到服务器,我应该尝试连接并得到我不想要的结果 我正在努力实现这样的目标Visual c++ 如何从套接字winsock2获取套接字状态,visual-c++,winsock2,Visual C++,Winsock2,如何从作为参数传递的套接字/文件描述符获取套接字是否已连接、绑定、侦听或关闭 注意:我想在不尝试绑定/connect/listen/closesocket的情况下计算套接字状态,因为这将返回一个结果并执行操作。示例:如果我想检查套接字是否连接到服务器,我应该尝试连接并得到我不想要的结果 我正在努力实现这样的目标 // Using Winsock2 API. bool isSocketBound(SOCKET s) { // Check if socket is bound without
// 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.
提前谢谢
如何从作为参数传递的套接字/文件描述符获取套接字是否已连接、绑定、侦听或关闭
没有单个套接字API来查询套接字的当前状态。然而:
- 将告诉您套接字是否在本地绑定
- 将告诉您套接字是否连接到远程对等方
- 使用该选项将告诉您面向连接(即TCP)的
SOCKET
是否正在listen()
或者,如果尝试在listen()
'ing套接字上connect()
,则会出现WSAEINVAL
错误。如果您尝试在connect()
的套接字上执行listen()
,则会出现WSAEISCONN
错误
或者,如果套接字至少在本地绑定,则可以使用getsockname()
获取其本地IP/端口,然后使用,或者确定该IP/端口是否处于侦听状态
- 如果一个
SOCKET
已在本地关闭,那么SOCKET
一开始就无效,因此您无法查询任何内容。您可以做的最好的事情就是在使用完SOCKET
后将其设置为INVALID\u SOCKET
,然后在需要时检查该条件。另一方面,如果套接字已远程关闭但尚未本地关闭,则套接字仍然有效,但无法查询其关闭状态。要知道套接字是否已被对等方关闭,唯一的方法是recv()
操作是否报告收到0字节,或者send()
操作是否因连接错误而失败,或者您是否正在异步模式下使用套接字(WSAAsyncSelect()
或WSAEventSelect()
)并收到关于它的FD_CLOSE
通知
注意:我想在不尝试绑定/connect/listen/closesocket的情况下计算套接字状态,因为这将返回一个结果并执行操作。示例:如果我想检查套接字是否连接到服务器,我应该尝试连接并得到我不想要的结果
为什么不在自己的代码中简单地跟踪状态?如果您bind()
aSOCKET
成功,那么您知道它是本地绑定的。如果您connect()
成功,则您知道它已绑定到本地并连接到远程服务器。您应该在套接字
变量旁边维护一个状态
变量,并在对套接字
执行的每个状态更改操作中更新状态我没有在代码中跟踪套接字状态的原因是我的类的构造函数接受了一个套接字,我想知道在构造函数中传递的套接字是否是绑定的。@GGBOI250为什么不让调用方传入一个参数来告诉您状态呢?别猜,利博,我能猜到,但是打电话的人在经过这个州的时候可能会无意中犯错误。