URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6551
[ Назад ]

Исходное сообщение
"Chat"

Отправлено nonick , 20-Июн-07 08:16 
Пытаюсь написать чат )
Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то слышал что надо использовать функцию select() или poll() только не понимаю, select смотрит изменение в нескольких сокетах сразу... это те сокеты которые получены accept() ?
А как же блокировка процесса accept пока не будет подключения? а если даже не будет блокировки, то select блокирует процесс, а значит не будет новых подключений пока кто нибудь что нибудь не напишет... ) воощем я что то не допонимаю, какие имменно сокеты должна слушать select?

P.S кусочек кода, как пример был бы очень кстати ;)


Содержание

Сообщения в этом обсуждении
"Chat"
Отправлено NuINu , 20-Июн-07 14:40 
>Пытаюсь написать чат )
>Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то
>слышал что надо использовать функцию select() или poll() только не понимаю,
>select смотрит изменение в нескольких сокетах сразу... это те сокеты которые
>получены accept() ?
нет селект смотрит только те дескрипторы(в том числе и сокеты) которые ты ему сам задашь смотреть макросом FD_SET

>А как же блокировка процесса accept пока не будет подключения? а если
у ассепта своя блокировка и селекта своя. если хочешь чтобы они работали вместе сначала запускаешь селект и ему говоришь что бы смотрел еще за листен сокетом. Если FD_ISSET вернет что установлен именно листен дескриптор то после этого надо запустить accept на этом дескрипторе. ну и вообщем обработать в цикле все возможные сокеты, которые могли вызвать срабатывание селекта.

есть еще функция poll ей так же можно пользоваться.

>даже не будет блокировки, то select блокирует процесс, а значит не
>будет новых подключений пока кто нибудь что нибудь не напишет... )
>воощем я что то не допонимаю, какие имменно сокеты должна слушать
>select?
>
>P.S кусочек кода, как пример был бы очень кстати ;)

кусочек кода? у меня нету. на эту тему есть на перле у Штайна(там логика описана) стр.360.
А использование селекта на си можно везде найти. хотябы в Шон Уолтон: Создание сетевых приложений в среде Линукс. c. 182


"Chat"
Отправлено wwwdev , 21-Июн-07 02:54 
>Пытаюсь написать чат )
>Столкнулся с проблемой... как обрабатывать несколько клиентов на одном порту? где то
>слышал что надо использовать функцию select() или poll() только не понимаю,
>select смотрит изменение в нескольких сокетах сразу... это те сокеты которые
>получены accept() ?
>А как же блокировка процесса accept пока не будет подключения? а если
>даже не будет блокировки, то select блокирует процесс, а значит не
>будет новых подключений пока кто нибудь что нибудь не напишет... )

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

>воощем я что то не допонимаю, какие имменно сокеты должна слушать
>select?

Вообще говоря, он слушает файловые дескрипторы, не только сокеты.

>
>P.S кусочек кода, как пример был бы очень кстати ;)

Вот тут простой пример http://nonblock.tripod.com/ds.html