您可以使用netstat命令获得连接状态(连接状态类似于ESTABLISHED或TIME_WAIT,等等)。
但是,您能否以编程方式获得套接字的连接状态?
发布于 2022-08-11 19:27:26
您不能查询SOCKET本身所需的状态类型。
但是,您可以查询套接字的类型(TCP )和分配给它的IP/端口对(即通过getsockopt()和状态,或者通过getsockopt(SO_TYPE) +getsockname()+getpeername()),然后可以枚举Windows的TCP/UDP表,直到找到与这些相同的详细信息匹配的条目为止,然后从该条目中获得状态。
查看以下枚举函数:
TCP:
GetTcpTable()/GetTcpTable2() (仅限IPv4)GetTcp6Table()/GetTcp6Table2() (仅限IPv6)GetExtendedTcpTable() ( IPv4和IPv6)UDP:
GetUdpTable() (仅限IPv4)GetUdp6Table() (仅限IPv6)GetExtendedUdpTable() ( IPv4和IPv6)发布于 2022-08-11 19:28:14
在Windows上,您可以使用getsockopt()和SO_BSP_STATE选项至少获取一些有关套接字状态的信息:
SO_BSP_STATE套接字选项返回套接字使用的本地地址、本地端口、远程地址、远程端口、套接字类型和协议。 若要执行此操作,请使用以下参数调用getsockopt函数。 表示此套接字选项的常量为0x1009。 语法 C++ int getsockopt( (套接字) s,//描述符标识套接字(int) SOL_SOCKET,// level (int) SO_BSP_STATE,// optname (char *) optval,//输出缓冲区,(int) *optlen,//输出缓冲区的大小); 参数 安在 标识套接字的描述符。 水平在 定义选项的级别。此操作使用SOL_SOCKET。 视光名 要检索值的套接字选项。此操作使用SO_BSP_STATE。 外视 指向要返回所请求选项的值的缓冲区的指针。此参数应指向等于或大于CSADDR_INFO结构大小的缓冲区。 进,出 指向optval缓冲区大小(以字节为单位)的指针。此大小必须等于或大于CSADDR_INFO结构的大小。 返回值 如果操作成功完成,getsockopt将返回零。 如果操作失败,则返回SOCKET_ERROR的值,并通过调用WSAGetLastError检索特定的错误代码。
一个结构定义作为
typedef struct _CSADDR_INFO {
SOCKET_ADDRESS LocalAddr;
SOCKET_ADDRESS RemoteAddr;
INT iSocketType;
INT iProtocol;
} CSADDR_INFO, *PCSADDR_INFO, *LPCSADDR_INFO;https://stackoverflow.com/questions/73325810
复制相似问题