我有以下代码
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)
是否返回true,FD_ISSET(fdr, &rfds)
是否返回false? 最佳答案
从POSIX standards reference page on select
开始:FD_ISSET(fd, fdsetp)
如果文件描述符fd是fdsetp所指集合的成员,则应计算为非零,否则应计算为零。
因此,没有提到FD_ISSET
的结果(实际上它不是一个函数,而是一个宏,在技术上它不会“返回”任何东西),只是它要么是零,要么是非零。
回答你的问题,是的。如果fd
是可读的,那么FD_ISSET(fd, &rfds)
将是非零(true)并且FD_ISSET(fdr, &rfds)
将是零(false)(除非它也是可读的,所以不要在那里使用else if
,两者都可能是true)。