FD_ISSET()是否返回接收到数据的文件描述符?

Does FD_ISSET() return the file descriptor which received data

本文关键字:数据 文件 描述 ISSET 返回 是否 FD      更新时间:2023-10-16

我有以下代码

fd = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface);
fdr = raw_socket(client_config.ifindex);
if (fd >= 0) FD_SET(fd, &rfds);
if (fdr >= 0) FD_SET(fdr, &rfds);
max_fd = fd > fdr ? fd : fdr;
retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
if (FD_ISSET(fd, &rfds)) {
    ....
} else if (FD_ISSET(fdr, &rfds)) {
    ....
}

如果我们从fd套接字接收数据,FD_ISSET(fd, &rfds)返回真,FD_ISSET(fdr, &rfds)返回假吗?

来自select的POSIX标准参考页:

如果文件描述符fd是fdsetp所指向的集合的成员,

FD_ISSET(fd, fdsetp)的求值为非零,否则求值为零。

所以确切的 FD_ISSET的结果(这实际上不是一个函数,而是一个宏,所以技术上它不"返回"任何东西)没有提到,只是它要么是零,要么是非零。

回答你的问题,是的。如果fd是可读的,那么FD_ISSET(fd, &rfds)将是非零(true), FD_ISSET(fdr, &rfds)将为零(false)(除非也是可读,所以不要在那里使用else if,两者都可能是true)。

是。这就是它的目的。阅读文档