c - 在选择阻塞时向 fd_Set 添加新的 FD

标签 c sockets select networking

我有一个关于向 FDSET 添加新套接字文件描述符的问题。假设我们已经连接到套接字 s1:

fd_set readfds;

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

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

我们正在等待数据通过套接字,通过在线程中调用 select:

socket_reader_thread() {

   for (;;)
   {
      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
         .....
      }
   }

}

如果我现在想向 readfds 集添加另一个套接字(或者可能是另外两个套接字等),假设 select 正在阻塞,我应该如何进行?我怎样才能中断选择

是添加零超时并使用类似轮询的选择的技巧吗?

最佳答案

你需要使用“管道技巧”。

这是创建附加套接字或管道的地方,将其添加到 fd_set。

然后要中断正在运行或挂起的选择,通过另一个线程向它发送一个 1 字节的消息。

然后选择将返回,如果特殊管道 FD 是集合中准备好的管道 FD 之一,这意味着您需要说查看列表或“做工作”的东西——比如将任何新的 FD 添加到fd_set 在返回到 select 调用之前设置。

关于c - 在选择阻塞时向 fd_Set 添加新的 FD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42501437/

相关文章:

sql - 合并两个 SQL 查询

PHP 套接字还是 Python、Perl、Bash 套接字?

c - 如何使用 tcp/ip 在两台不同计算机之间运行客户端服务器通信?

Java 和 MySQL,SELECT 有效;插入不

c - 警报失败,连接到 AWS IoT 时错误 = 42

ios - 应用扩展 : multiple instances interfering with each other

c 编程语言 - declare() 函数

c - 需要理解这个If语句

java - 使用套接字进行数据传输。 Java 和 Firefox 扩展

mysql - 在 NodeJS 中传递键值数组以进行 MySQL 选择查询