检查套接字是否正在C中侦听

时间:2012-04-21 15:59:31

标签: c sockets file-descriptor

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

4 个答案:

答案 0 :(得分:21)

可以使用getsockoptSO_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 :(得分:0)

你无法说出来。您必须自己跟踪它,并且当您想要检查套接字是否是您已保存的套接字时的监听套接字。

答案 2 :(得分:0)

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

然而,跟踪哪个套接字是更好的解决方案。除非你正在构建一个非常简单的应用程序,否则你可能需要在每个套接字上保留一些额外的数据。

答案 3 :(得分:-1)

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

lsof -i

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

netstat -a