Пытаюсь написать чат )
Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то слышал что надо использовать функцию select() или poll() только не понимаю, select смотрит изменение в нескольких сокетах сразу... это те сокеты которые получены accept() ?
А как же блокировка процесса accept пока не будет подключения? а если даже не будет блокировки, то select блокирует процесс, а значит не будет новых подключений пока кто нибудь что нибудь не напишет... ) воощем я что то не допонимаю, какие имменно сокеты должна слушать select?P.S кусочек кода, как пример был бы очень кстати ;)
>Пытаюсь написать чат )
>Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то
>слышал что надо использовать функцию select() или poll() только не понимаю,
>select смотрит изменение в нескольких сокетах сразу... это те сокеты которые
>получены accept() ?
нет селект смотрит только те дескрипторы(в том числе и сокеты) которые ты ему сам задашь смотреть макросом FD_SET
>А как же блокировка процесса accept пока не будет подключения? а если
у ассепта своя блокировка и селекта своя. если хочешь чтобы они работали вместе сначала запускаешь селект и ему говоришь что бы смотрел еще за листен сокетом. Если FD_ISSET вернет что установлен именно листен дескриптор то после этого надо запустить accept на этом дескрипторе. ну и вообщем обработать в цикле все возможные сокеты, которые могли вызвать срабатывание селекта.есть еще функция poll ей так же можно пользоваться.
>даже не будет блокировки, то select блокирует процесс, а значит не
>будет новых подключений пока кто нибудь что нибудь не напишет... )
>воощем я что то не допонимаю, какие имменно сокеты должна слушать
>select?
>
>P.S кусочек кода, как пример был бы очень кстати ;)кусочек кода? у меня нету. на эту тему есть на перле у Штайна(там логика описана) стр.360.
А использование селекта на си можно везде найти. хотябы в Шон Уолтон: Создание сетевых приложений в среде Линукс. c. 182
>Пытаюсь написать чат )
>Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то
>слышал что надо использовать функцию select() или poll() только не понимаю,
>select смотрит изменение в нескольких сокетах сразу... это те сокеты которые
>получены accept() ?
>А как же блокировка процесса accept пока не будет подключения? а если
>даже не будет блокировки, то select блокирует процесс, а значит не
>будет новых подключений пока кто нибудь что нибудь не напишет... )Блокирует не более чем на значение таймаута, которое передаешь в select().
Если слушать одновременно также listen-сокеты, то при подключениях тоже будет срабатывать select().>воощем я что то не допонимаю, какие имменно сокеты должна слушать
>select?Вообще говоря, он слушает файловые дескрипторы, не только сокеты.
>
>P.S кусочек кода, как пример был бы очень кстати ;)Вот тут простой пример http://nonblock.tripod.com/ds.html