Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP套接字上的select()仅在第一个循环中起作用 void async\u socket\u rcv(int clientfd); int main(int argc,char*argv[]) { //将缓冲区配置为立即输出 setvbuf(标准输出,0,_IONBF,0); //Mysql版本 printf(“MySQL客户端版本:%s\n”,MySQL_get_client_info()); //初始化套接字的FDs int socketfd,clientfd; //初始化要监视输入的FD列表 fd_设置fd_监视器; int选择_res; FD_零点(和FD_监视器); struct timeval选择超时; 选择_timeout.tv_sec=3; 选择_timeout.tv_usec=0; //初始化线程id pthread\u t线程; ... //创建侦听套接字 socketfd=create_inet_server_socket(“0.0.0.0”,“5671”,LIBSOCKET_TCP,LIBSOCKET_IPv4,0); if(socketfd_C_Multithreading_Sockets_Select_Tcp - Fatal编程技术网

TCP套接字上的select()仅在第一个循环中起作用 void async\u socket\u rcv(int clientfd); int main(int argc,char*argv[]) { //将缓冲区配置为立即输出 setvbuf(标准输出,0,_IONBF,0); //Mysql版本 printf(“MySQL客户端版本:%s\n”,MySQL_get_client_info()); //初始化套接字的FDs int socketfd,clientfd; //初始化要监视输入的FD列表 fd_设置fd_监视器; int选择_res; FD_零点(和FD_监视器); struct timeval选择超时; 选择_timeout.tv_sec=3; 选择_timeout.tv_usec=0; //初始化线程id pthread\u t线程; ... //创建侦听套接字 socketfd=create_inet_server_socket(“0.0.0.0”,“5671”,LIBSOCKET_TCP,LIBSOCKET_IPv4,0); if(socketfd

TCP套接字上的select()仅在第一个循环中起作用 void async\u socket\u rcv(int clientfd); int main(int argc,char*argv[]) { //将缓冲区配置为立即输出 setvbuf(标准输出,0,_IONBF,0); //Mysql版本 printf(“MySQL客户端版本:%s\n”,MySQL_get_client_info()); //初始化套接字的FDs int socketfd,clientfd; //初始化要监视输入的FD列表 fd_设置fd_监视器; int选择_res; FD_零点(和FD_监视器); struct timeval选择超时; 选择_timeout.tv_sec=3; 选择_timeout.tv_usec=0; //初始化线程id pthread\u t线程; ... //创建侦听套接字 socketfd=create_inet_server_socket(“0.0.0.0”,“5671”,LIBSOCKET_TCP,LIBSOCKET_IPv4,0); if(socketfd,c,multithreading,sockets,select,tcp,C,Multithreading,Sockets,Select,Tcp,大家好 我试图在客户端连接时使用select()函数调用函数,而不必阻塞accept()函数。我需要能够在不中断服务器的情况下接受stdin 我上面的代码可以工作,但只有一次。当我逐步浏览代码时,我可以看到只有在select()的第一次迭代中连接到服务器时,select\u res才是1。在那之后,什么也没有发生 我相信你们中的一位会发现我的一些小错误,但就我的一生而言,我看不出我做错了什么…select更改传入的fd\u集,设置有活动的描述符,取消那些没有活动的描述符。由于没有在循环中重置fd

大家好

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

我上面的代码可以工作,但只有一次。当我逐步浏览代码时,我可以看到只有在
select()
的第一次迭代中连接到服务器时,
select\u res
才是1。在那之后,什么也没有发生


我相信你们中的一位会发现我的一些小错误,但就我的一生而言,我看不出我做错了什么…

select
更改传入的
fd\u集,设置有活动的描述符,取消那些没有活动的描述符。由于没有在循环中重置
fd\u监视器
,因此使用了更改后的
fd\u集


FD_ZERO
FD_SET
调用移动到循环的开头。

select
更改传入的
FD_SET
s,设置有活动的描述符,取消设置没有活动的描述符。由于没有在循环中重置
fd\u监视器
,因此使用了更改后的
fd\u集


FD_ZERO
FD_SET
调用移动到循环的开头。

虽然上面的答案是100%正确,但它实际上说明了为什么现在使用select()会像18世纪一样。有一个很棒的poll(),如果使用它,将使您免于所有的麻烦

虽然上面的答案是100%正确的,但它实际上说明了为什么现在使用select()会像18世纪一样困难。有一个很棒的poll(),如果使用它,将使您免于所有的麻烦

谢谢你,先生!我一定读了20遍了。。。“返回时,每个输入集都会被修改,以指示已准备好的描述子集。”很抱歉,它没有到达旧瓜:)谢谢您,先生!我一定读了20遍了。。。“返回时,每个输入集都会被修改,以指示已准备好的描述子集。”很抱歉,它没有到达旧瓜:)我不记得在哪里,但我似乎记得读到投票比选择更昂贵。符合事实的这个服务器将运行在一个覆盆子piI从来没有听说过投票比选择更昂贵。select允许以纳秒(通过timeval)为单位指定超时,但poll只提供毫秒。但这不是延迟,这是最大等待超时。除此之外,我不知道选择优于投票有什么好处。你知道投票优于选择除了简单之外还有什么好处吗?@MatthewGoulart从我收集的信息来看,
select
是一个较旧的界面,并且没有扩展,这导致了
poll
的创建。另请参见@MatthewGoulart,您的整个问题清楚地指出了其中的一个:)由于poll()返回受影响的描述符与subscribed分开,因此您不需要重新初始化它们,而且上面的问题根本不会发生!想象一下,调试节省了几个小时。我不记得在哪里,但我似乎记得读过,民意调查比选择更昂贵。符合事实的这个服务器将运行在一个覆盆子piI从来没有听说过投票比选择更昂贵。select允许以纳秒(通过timeval)为单位指定超时,但poll只提供毫秒。但这不是延迟,这是最大等待超时。除此之外,我不知道选择优于投票有什么好处。你知道投票优于选择除了简单之外还有什么好处吗?@MatthewGoulart从我收集的信息来看,
select
是一个较旧的界面,并且没有扩展,这导致了
poll
的创建。另请参见@MatthewGoulart,您的整个问题清楚地指出了其中的一个:)由于poll()返回受影响的描述符与subscribed分开,因此您不需要重新初始化它们,而且上面的问题根本不会发生!想象一下,调试节省了几个小时。
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;

}