检查C语言中的套接字是否正在监听

16

在迭代套接字文件描述符时,如何检查其中一个来自被动套接字(用于监听连接)?

3个回答

26

可以使用getsockopt(SO_ACCEPTCONN)来进行检查。例如:

#include <sys/socket.h>

int val;
socklen_t len = sizeof(val);
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1)
    printf("fd %d is not a socket\n", fd);
else if (val)
    printf("fd %d is a listening socket\n", fd);
else
    printf("fd %d is a non-listening socket\n", fd);

1
值得一提的是:Mac OS X High Sierra(10.13.6)似乎不接受SO_ACCEPTCONN。getsockopt的man页面上没有它;调用会返回错误42:协议不可用。 - Sam Habiel

0

您可以在命令行中运行(在Mac/Linux环境下):

lsof -i

和/或(Linux/Mac/Windows 环境)

netstat -a

他要求提供一个 C 语言的解决方案(而不是我失败了)。 - peterh

0

严格来说,您可以尝试在套接字上执行一个操作,这将无意中确定它是哪种类型的套接字,例如尝试从中接受连接。如果accept()失败并返回EINVAL,则很可能表明它没有在侦听。

总的来说,跟踪每个套接字的类型是更好的解决方案。除非您正在构建一个非常简单的应用程序,否则您很可能需要在每个套接字上保留某些额外的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接