在C中调用select()之后知道哪些文件描述符已准备就绪

时间:2014-03-30 01:32:09

标签: c sockets select-function

我是套接字编程的新手,我已经了解了select()系统调用。我的问题是,假设我正在用C编写服务器(我正在尝试这样做),并且我希望在我的实现中使用select()调用来练习。我正在尝试编写一个从客户端接收信息的服务器,因此我的方法是使用select(),然后使用read()并输出信息。

根据我阅读的文档select(),返回输入集中准备用于i / o的文件描述符的 number 。我的问题是,如何知道原始集合中哪些文件描述符是为i / o做好准备的?我似乎无法在我过去看过的搜索或示例中找到这个。

假设我的代码如下所示:

int main() {
/* Create socket/server variables */
    int select_value;
    int this_socket;
    int maxfd;
    struct sockadder_in address; 
    fd_set allset;

    /* Bind the socket to a port */
    main_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (main_socket < 0) {
        perror("socket()");
        exit(1);
    }

    Connect(main_socket, (struct sockaddr *)&address, sizeof(address));

    /* Add the socket to the list of fds to be monitored */
    FD_ZERO(&allset);
    FD_SET(main_socket, &allset);

    fd_set read_ready = allset;
    fd_set write_ready = allset;

    while (1) {
        /* Listen for a connection */
        /* Accept a connection */
        select_value = Select(maxfd+1, &read_ready, &write_ready, NULL, NULL);
        if (select_value == -1) {
            perror("select()");
            exit(1);
        }
        else if(select_value > 0) {
            /* How to access i/o ready file descriptors
            now that we know there are some available? */
        }
    }
} 

1 个答案:

答案 0 :(得分:3)

可以使用属于FD_ISSET的{​​{1}}宏来执行此操作。

当您的<sys/select.h>解除阻塞和文件描述符准备就绪时,您可以在一个简单的循环中使用select宏测试所有文件描述符。这可以转换为以下示例:

FD_ISSET

当然,这只是一个明显缺乏任何错误处理的示例,您应该在应用程序中处理。