在C套接字编程中选择只接收一个连接

时间:2018-06-03 01:41:57

标签: c sockets select

我使用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将其删除。我试过但它导致程序只接收一个套接字连接,之后它不再接收连接

1 个答案:

答案 0 :(得分:0)

  每次循环重复时,

我都可以不使用FD_SET

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

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