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

Исходное сообщение
"локальные сокеты и многократный 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 , 23-Янв-09 06:48 
Может вам попробовать так:

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

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


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

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


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

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


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

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


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

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