TCP套接字上的select()仅适用于第一个循环

时间:2015-09-15 17:34:06

标签: c multithreading sockets select tcp

void async_socket_rcv(int clientfd);

int main(int argc, char *argv[])
{
    //Configure buffer to output immediately
    setvbuf(stdout, 0, _IONBF, 0);

    //Mysql version
    printf("MySQL client version: %s\n", mysql_get_client_info());

    //Initialize the FDs for the sockets
    int socketfd, clientfd;

    //Initialize the list of FDs to monitor for input
    fd_set fd_monitor;
    int select_res;
    FD_ZERO(&fd_monitor);

    struct timeval select_timeout;
    select_timeout.tv_sec = 3;
    select_timeout.tv_usec = 0;


    //Initialize the thread id
    pthread_t thread;

    ...

    //Create the listen socket
    socketfd = create_inet_server_socket("0.0.0.0", "5671", LIBSOCKET_TCP, LIBSOCKET_IPv4, 0);

    if(socketfd < 0){
        printf("Error creating listen socket!");
        return -1;
    }else{
        printf("Listening...");
    }

    FD_SET(socketfd, &fd_monitor);
    //FD_SET(STDIN_FILENO, &fd_monitor);

    while(1)
    {
        select_res = select(sizeof(fd_monitor) * 8, &fd_monitor, NULL, NULL, &select_timeout);

        if(FD_ISSET(socketfd, &fd_monitor))
        {
            clientfd = accept_inet_stream_socket(socketfd,0,0,0,0,0,0);
            pthread_create(&thread, NULL, async_socket_rcv, clientfd);
        }
        select_timeout.tv_sec = 3;
        select_timeout.tv_usec = 0;
    }

    return 0;

}

大家好

我正在尝试使用select()函数在客户端连接时调用函数,而不必阻塞accept()函数。我需要能够在不中断服务器的情况下接受stdin

上面的代码有效,但只有一次。当我单步执行代码时,如果我在{em>第一次迭代select_res内连接到服务器,我可以看到select()仅为1 。之后,没有任何反应。

我相信你们其中一人会发现我的一些小错误,但对于我的生活,我看不出我做错了什么......

2 个答案:

答案 0 :(得分:4)

select改变传入的fd_set,设置具有活动的描述符,并取消设置不具有活动的描述符。由于您未在循环中重置fd_monitor,因此您使用了已更改的fd_set

FD_ZEROFD_SET调用移至循环的开头。

答案 1 :(得分:0)

虽然上面的答案是100%正确,但它实际上说明了为什么使用select()现在闻起来像18世纪。有一个很好的民意调查(),使用后,可以免除你所有的麻烦!