在遍历套接字文件描述符时,如何检查其中一个是否来自被动套接字(侦听连接)?
问问题
6085 次
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 回答