在迭代套接字文件描述符时,如何检查其中一个来自被动套接字(用于监听连接)?
可以使用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);
您可以在命令行中运行(在Mac/Linux环境下):
lsof -i
和/或(Linux/Mac/Windows 环境)
netstat -a
严格来说,您可以尝试在套接字上执行一个操作,这将无意中确定它是哪种类型的套接字,例如尝试从中接受连接。如果accept()
失败并返回EINVAL,则很可能表明它没有在侦听。
总的来说,跟踪每个套接字的类型是更好的解决方案。除非您正在构建一个非常简单的应用程序,否则您很可能需要在每个套接字上保留某些额外的数据。