Выбрать в C Socket Programming получает только одно соединение - PullRequest
0 голосов
/ 03 июня 2018

Я использую 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, чтобы удалить его при отключении.Я пытался, но это приводит к тому, что программа получает только одно соединение с сокетом, после этого она больше не получает соединения

1 Ответ

0 голосов
/ 03 июня 2018

можно ли сделать то же самое без использования FD_SET каждый раз, когда цикл повторяется

Нет.select() изменяет наборы FD.Вы должны сбрасывать их перед каждым select().

. Вы можете сохранить копию всех наборов и просто переназначить их вместо цикла: но если действия в цикле выбора изменяют наборы, вы должны изменитьмастер-копия, а не та, которую select() использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...