C Socket 编程中选择只接收一个连接

问题描述 投票:0回答:1

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

c sockets posix-select
1个回答
1
投票

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

不。

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

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

select()
正在使用的副本。

© www.soinside.com 2019 - 2024. All rights reserved.