The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
локальные сокеты и многократный bind на один адрес, !*! FleX, 23-Янв-09, 06:28  [смотреть все]
Здравствуйте, помогите разобраться.

Пробую написать мультипоточный демон на си++ использующий для связи клиент-сервер локальные сокеты (AF_UNIX). Все потоки сервера должны слушать один и тот же локальный адрес, скажем, "./dserver.sock", но сделать bind получается только для одного потока. Поиском нашел решение только для AF_INET сокетов: помог бы флаг "SO_REUSEADDR", но для локальных сокетов (AF_UNIX) он бесполезен. Как же сделать мультипоточность, чтобы сервер смог слушать и обрабатывать одновременно "./dserver.sock" ?


Спасибо!

ps. тип сокета SOCK_STREAM, возможно использовать нужно другой тип и флаг заработает?

  • локальные сокеты и многократный bind на один адрес, !*! from_mars, 06:48 , 23-Янв-09 (1)
    Может вам попробовать так:

    // основной поток серевера
    s = socket();
    bind(s);
    listen(s);
    while (1) {
      c = accept(s);
      // далее создаем поток или выбираем созданный поток из пула потоков
      // и отдаем ему c
    }

    Для AF_INET такой вариант работает, не знаю как дело будет с AF_UNIX,
    не когда под них не прогал раннее :)

    • локальные сокеты и многократный bind на один адрес, !*! FleX, 18:08 , 23-Янв-09 (3)
      >[оверквотинг удален]
      >while (1) {
      >  c = accept(s);
      >  // далее создаем поток или выбираем созданный поток из пула
      >потоков
      >  // и отдаем ему c
      >}
      >
      >Для AF_INET такой вариант работает, не знаю как дело будет с AF_UNIX,
      >
      >не когда под них не прогал раннее :)

      Спасибо! так получилось все что нужно, теперь главный поток управляющий, а остальные рабочии. Теперь пробую найти докумендация, как сделать именно пул потоков, как вы написали, чтобы не создавать каждый раз новый поток при запросе, а давать сигнал существующему.

      • локальные сокеты и многократный bind на один адрес, !*! devcoder, 19:17 , 23-Янв-09 (4)
        > Теперь пробую найти докумендация, как сделать именно пул потоков, как
        >вы написали, чтобы не создавать каждый раз новый поток при запросе,
        >а давать сигнал существующему.

        У. Р. Стивенс
        UNIX. Разработка сетевых приложений
        3-е издание

        • локальные сокеты и многократный bind на один адрес, !*! FleX, 22:06 , 23-Янв-09 (5)
          >> Теперь пробую найти докумендация, как сделать именно пул потоков, как
          >>вы написали, чтобы не создавать каждый раз новый поток при запросе,
          >>а давать сигнал существующему.
          >
          >У. Р. Стивенс
          >UNIX. Разработка сетевых приложений
          >3-е издание

          Спасибо! Нашел, уже читаю, правда только 2-е издание (отсканированое, в очень плохом качестве), 3-его вроде как нет нигде :-( надеюсь разберусь что к чему и примеры там найду. пока что понял, что нужно использовать мьютексы и pthread_cond_t совместно для сигналов созданым ранее потокам. дочернии потоки блокируются, пока родительский поток не подаст сигнал о том, что очередь не пуста. далее разблокируем мьютекс и запускаем поток. как-то так.

  • локальные сокеты и многократный bind на один адрес, !*! Michelnok, 11:43 , 23-Янв-09 (2)
    >
    >Пробую написать мультипоточный демон на си++ использующий для связи клиент-сервер локальные сокеты
    >(AF_UNIX). Все потоки сервера должны слушать один и тот же локальный
    >адрес, скажем, "./dserver.sock", но сделать bind получается только для одного потока.

    Используй один сокет для всех потоков.




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

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