15

在遍历套接字文件描述符时,如何检查其中一个是否来自被动套接字(侦听连接)?

4

3 回答 3

24

这可以通过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);
于 2012-04-21T18:08:06.513 回答
0

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

lsof -i

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

netstat -a
于 2012-04-21T17:02:11.087 回答
0

严格来说,您可以尝试对套接字执行一个操作,该操作会偶然确定它是什么类型的套接字,例如尝试接受来自它的连接。如果accept()EINVAL 失败,这是一个很好的迹象,表明它没有在听。:)

不过,跟踪哪些套接字是总体上更好的解决方案。除非您正在构建一个非常简单的应用程序,否则您可能需要在每个套接字上保留某种附加数据。

于 2012-04-21T17:58:09.970 回答