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

时间:2015-06-09 14:15:09

标签: c++ c linux sockets select

我有以下代码

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?

2 个答案:

答案 0 :(得分:2)

来自POSIX standards reference page on select

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

FD_ISSET(fd, fdsetp)将评估为非零,否则将评估为零。

确切地说 FD_ISSET的结果(它实际上不是一个函数,而是一个宏在技术上它没有“返回”任何东西)没有提到,只是它是零或非零。

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

答案 1 :(得分:2)

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