Верно ли это, когда речь идет о вашем коде?
select(highest_file_descriptor+1, &readnet, NULL, NULL, &timeout);
В вашем простом примере (с перемещением FD_ZERO и FD_SET внутри цикла while (1), как сказал qrdl), оно должно выглядеть так:
select(sockfd+1, &readnet, NULL, NULL, &timeout);
Также обратите внимание, что когда recv возвращает 0 байт, это означает, что соединение было закрыто - больше никаких данных!Ваш код также содержит ошибки - когда в recv происходит что-то плохое (когда это происходит, возвращается <0), у вас будут серьезные проблемы, потому что что-то вроде buf [-1] может привести к непредсказуемым результатам.Пожалуйста, обработайте этот случай правильно. </p>
Хотя я уважаю тот факт, что вы пытаетесь использовать низкоуровневый API сокетов BSD, я должен сказать, что я нахожу его ужасно неэффективным.Вот почему я рекомендую вам, если возможно, использовать ACE , который является очень эффективной и продуктивной средой, в которой уже реализовано множество вещей, когда речь идет о сетевом программировании (например, ACE_Reactor - это то, что облегчаетделать то, что вы пытаетесь достичь здесь).