Visual c++ 如何从套接字winsock2获取套接字状态

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

如何从作为参数传递的套接字/文件描述符获取套接字是否已连接、绑定、侦听或关闭

注意:我想在不尝试绑定/connect/listen/closesocket的情况下计算套接字状态,因为这将返回一个结果并执行操作。示例:如果我想检查套接字是否连接到服务器,我应该尝试连接并得到我不想要的结果

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

// 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()
a
SOCKET
成功,那么您知道它是本地绑定的。如果您
connect()
成功,则您知道它已绑定到本地并连接到远程服务器。您应该在
套接字
变量旁边维护一个
状态
变量,并在对
套接字
执行的每个状态更改操作中更新
状态

我没有在代码中跟踪套接字状态的原因是我的类的构造函数接受了一个套接字,我想知道在构造函数中传递的套接字是否是绑定的。@GGBOI250为什么不让调用方传入一个参数来告诉您状态呢?别猜,利博,我能猜到,但是打电话的人在经过这个州的时候可能会无意中犯错误。