Chat, nonick, 20-Июн-07, 08:16 [смотреть все]Пытаюсь написать чат ) Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то слышал что надо использовать функцию select() или poll() только не понимаю, select смотрит изменение в нескольких сокетах сразу... это те сокеты которые получены accept() ? А как же блокировка процесса accept пока не будет подключения? а если даже не будет блокировки, то select блокирует процесс, а значит не будет новых подключений пока кто нибудь что нибудь не напишет... ) воощем я что то не допонимаю, какие имменно сокеты должна слушать select? P.S кусочек кода, как пример был бы очень кстати ;) |
- Chat, NuINu, 14:40 , 20-Июн-07 (1)
>Пытаюсь написать чат ) >Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то >слышал что надо использовать функцию select() или poll() только не понимаю, >select смотрит изменение в нескольких сокетах сразу... это те сокеты которые >получены accept() ? нет селект смотрит только те дескрипторы(в том числе и сокеты) которые ты ему сам задашь смотреть макросом FD_SET >А как же блокировка процесса accept пока не будет подключения? а если у ассепта своя блокировка и селекта своя. если хочешь чтобы они работали вместе сначала запускаешь селект и ему говоришь что бы смотрел еще за листен сокетом. Если FD_ISSET вернет что установлен именно листен дескриптор то после этого надо запустить accept на этом дескрипторе. ну и вообщем обработать в цикле все возможные сокеты, которые могли вызвать срабатывание селекта.есть еще функция poll ей так же можно пользоваться. >даже не будет блокировки, то select блокирует процесс, а значит не >будет новых подключений пока кто нибудь что нибудь не напишет... ) >воощем я что то не допонимаю, какие имменно сокеты должна слушать >select? > >P.S кусочек кода, как пример был бы очень кстати ;) кусочек кода? у меня нету. на эту тему есть на перле у Штайна(там логика описана) стр.360. А использование селекта на си можно везде найти. хотябы в Шон Уолтон: Создание сетевых приложений в среде Линукс. c. 182
- Chat, wwwdev, 02:54 , 21-Июн-07 (2)
>Пытаюсь написать чат ) >Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то >слышал что надо использовать функцию select() или poll() только не понимаю, >select смотрит изменение в нескольких сокетах сразу... это те сокеты которые >получены accept() ? >А как же блокировка процесса accept пока не будет подключения? а если >даже не будет блокировки, то select блокирует процесс, а значит не >будет новых подключений пока кто нибудь что нибудь не напишет... ) Блокирует не более чем на значение таймаута, которое передаешь в select(). Если слушать одновременно также listen-сокеты, то при подключениях тоже будет срабатывать select(). >воощем я что то не допонимаю, какие имменно сокеты должна слушать >select? Вообще говоря, он слушает файловые дескрипторы, не только сокеты. > >P.S кусочек кода, как пример был бы очень кстати ;) Вот тут простой пример http://nonblock.tripod.com/ds.html
|