C 中的 select() 出错
Posted
技术标签:
【中文标题】C 中的 select() 出错【英文标题】:select() in C goes wrong 【发布时间】:2022-01-09 20:13:40 【问题描述】:我正在学习select()
函数来同时处理多个客户端。我的代码来自:https://www.geeksforgeeks.org/socket-programming-in-cc-handling-multiple-clients-on-server-without-multi-threading/
我不明白为什么我必须将sd
的值赋予master_clone
。我试图在没有的情况下这样做,但程序没有按预期工作。 sd
的值为 0 那么这有什么关系呢?所以我的问题是:为什么我必须将sd
的值赋予master_socket
?
// Initialise all client_sockets[] to 0, so it's not checked
for (i = 0; i < MAX_CLIENTS; i++)
client_sockets[i] = 0;
while (1)
// Clearing the file descriptor set
FD_ZERO(&fdsForReading);
// Add master_socket to file descriptor set
FD_SET(master_socket, &fdsForReading);
master_clone = master_socket;
// Add child sockets to file descriptor set
for (i = 0; i < MAX_CLIENTS; i++)
// socket descriptor
sd = client_sockets[i];
// If valid socket descriptor then add to read list
if (sd > 0)
FD_SET(sd, &fdsForReading); // Hier plaatsen we alle File Descriptors in 'fdsForReading'
// Highest file descriptor number, need it for the select function
if (sd > master_clone)
master_clone = sd; // <-- This one
// Wait for an activity on one of the sockets, timeout is NULL, so wait indefinitely
printf("select()\n");
activity = select(master_clone + 1, &fdsForReading, NULL, NULL, NULL);
printf("TEST\n");
【问题讨论】:
题外话——如果在 POSIX 上你可能想看看poll
,使用起来更方便......
我会将master_clone
重命名为maximum_fd_value
或类似名称,只是为了使其目的更加明显。顺便说一句,只有一个客户端的套接字可以具有0
的值(通常甚至没有一个,因为传统上0
是stdin
的文件描述符)
【参考方案1】:
出于内部原因,select 使用位掩码来表示要监视的每个文件描述符。 第一个参数告诉选择它必须使用的位掩码的宽度,以便处理所有相关的文件描述符(如果不需要,请避免观看更多的文件)。
【讨论】:
以上是关于C 中的 select() 出错的主要内容,如果未能解决你的问题,请参考以下文章
出现数字符号 (#) 时,MS Access SELECT 语句出错
SQL Server:带有内部 SELECT 和子 SELECT 的 SUM()。每次都出错