【问题标题】:Added the same socket fd twice to fd_set then calling select将相同的套接字 fd 两次添加到 fd_set 然后调用 select
【发布时间】:2017-07-19 01:29:40
【问题描述】:

我一直在阅读 select 的手册页(来自不同的来源),似乎无法得到直接的解释。

假设我已经连接了一个这样的套接字:

s1 = socket(...);
connect(s1, ...)...

现在假设我将套接字两次(例如:错误地)添加到同一个 fd_set,如下所示:

fd_set readfds;


FD_ZERO(&readfds);
FD_SET(s1, &readfds);
....
FD_SET(s1, &readfds);

现在我调用 select:

int rv = select(n, &readfds, NULL, NULL, &tv);

if (rv == -1) {
   perror("select"); // error occurred in select()
}
else if (rv == 0) {
   printf("Timeout occurred!  No data after 10.5 seconds.\n");
}
else {
   // one the descriptors have data
   .....
}

如果数据是从套接字发送的,select 会将两个 FD 都设置为就绪,还是只设置我添加的第一个?

【问题讨论】:

  • 不,将同一个套接字多次设置到同一个读取集中不会导致任何问题。 S1 可以看作是 readfds 中的一个索引。
  • 套接字编号列表在(在当前场景中)readfds 数据结构内实现为位图,多次设置同一位会导致对 FDSET() 的调用没有进一步的效果,除了第一次调用那个特定的套接字号

标签: c sockets select networking


【解决方案1】:

由于FD_SET 是一个集合(在这个词的数学含义中),任何文件描述符要么是中,要么是。向集合中多次添加相同的描述符无效。

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多