【问题标题】:Select in C Socket Programming receives only one connectionC Socket编程中的选择只接收一个连接
【发布时间】:2018-11-12 17:26:42
【问题描述】:

我正在使用 Select 来监视文件描述符中的事件。 在一个无限循环中,我看到在每次重复时,都会调用FD_ZERO,然后所有文件描述符都附有FD_SET。每次循环开始时所有这些。

   while(TRUE)  
   {  
     //clear the socket set 
     FD_ZERO(&readfds);

     //add master socket to set 
     FD_SET(master_socket, &readfds);  
     max_sd = master_socket;  

     //add child sockets to set 
     for ( i = 0 ; i < clients ; i++)  
     {  
        //socket descriptor 
        sd = client_socket[i];  
        FD_SET( sd , &readfds);  

        //highest file descriptor number, need it for the select 
        // function 
        if(sd > max_sd)  
            max_sd = sd;  
      }  

    //wait for an activity on one of the sockets , timeout is NULL , 
    //so wait indefinitely 

    activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL);

    /*
        ...  */ 
     }

我的问题是:我可以在每次循环重复时不使用FD_SET 做同样的事情吗?我的意思是使用FD_ZERO 并在循环之前附加MASTER SOCKET,如果有新的套接字,我们会收到它并在断开连接时使用FD_SETFD_CLR 将其删除。我试过但它导致程序只接收一个套接字连接,之后它不再接收连接

【问题讨论】:

    标签: c sockets select


    【解决方案1】:

    我可以在每次循环重复时不使用 FD_SET 做同样的事情吗

    没有。 select() 修改 FD 集。您必须在每个 select() 之前重置它们。

    您可以保存整个集合的副本并重新分配,而不是循环:但如果选择循环中的操作修改了集合,您必须修改主副本,而不是 select() 正在使用的那个。

    【讨论】:

    • 不,这意味着您的代码是一种方式,而从主副本直接分配是另一种方式。它也确实了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2018-09-16
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多