【问题标题】:Does FD_ISSET() return the file descriptor which received dataFD_ISSET() 是否返回接收数据的文件描述符
【发布时间】:2015-06-09 14:15:08
【问题描述】:

我有以下代码

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?

【问题讨论】:

  • 试试看就知道了??

标签: c++ c linux sockets select


【解决方案1】:

来自POSIX standards reference page on select

如果文件描述符 fd 是 fdsetp 指向的集合的成员,FD_ISSET(fd, fdsetp) 应计算为非零,否则计算为 0。

所以 what 没有提到FD_ISSET 的结果(它实际上不是一个函数,而是一个宏,所以从技术上讲它不会“返回”任何东西),只是它要么为零要么非零。

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

【讨论】:

  • 所以 FD_ISSET 结果取决于选择函数
  • @MOHAMED 是的,select 函数会修改传递给它的集合。这就是为什么如果你在循环中调用select,你应该总是在每次调用之前重新初始化集合。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多