The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру