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 的值(通常甚至没有一个,因为传统上0stdin 的文件描述符) 【参考方案1】:

出于内部原因,select 使用位掩码来表示要监视的每个文件描述符。 第一个参数告诉选择它必须使用的位掩码的宽度,以便处理所有相关的文件描述符(如果不需要,请避免观看更多的文件)。

【讨论】:

以上是关于C 中的 select() 出错的主要内容,如果未能解决你的问题,请参考以下文章

出现数字符号 (#) 时,MS Access SELECT 语句出错

SQL Server:带有内部 SELECT 和子 SELECT 的 SUM()。每次都出错

py4JJava 错误 - 使用 select 语句时出错

从 update 语句成功调用函数,但从 select 语句调用时出错

SELECT 中的多个联接

Oracle SQL UPDATE SELECT with JOIN 出错