2012-04-21 98 views

回答

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

是的,我只是想把它附加到一个文件描述符集并使用它来检查。谢谢你的回答! – 2012-04-21 16:07:00

+2

'getsockopt(SOL_SOCKET,SO_ACCEPTCONN)'是检查套接字进行收听的正确方法。您应该接受mark4o的回答。 – 2012-04-21 18:35:27

+0

@RemyLebeau我不知道。虽然它可能是更多的代码,但它更适合OP的问题。 – 2012-04-21 19:07:19

-1

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

lsof -i 

和/或(Linux的/ MAC /的Windows环境)

netstat -a 
+0

他问一个C解决方案(不是我是下来)。 – peterh 2016-06-25 21:48:41

0

严格地说,你可以尝试在套接字上执行一个操作,这会偶然地确定它是什么类型的套接字,比如尝试接受来自它的连接。如果accept()与EINVAL失败,这是一个非常好的迹象,它不听。 :)

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