Здравствуйте, помогите разобраться.Пробую написать мультипоточный демон на си++ использующий для связи клиент-сервер локальные сокеты (AF_UNIX). Все потоки сервера должны слушать один и тот же локальный адрес, скажем, "./dserver.sock", но сделать bind получается только для одного потока. Поиском нашел решение только для AF_INET сокетов: помог бы флаг "SO_REUSEADDR", но для локальных сокетов (AF_UNIX) он бесполезен. Как же сделать мультипоточность, чтобы сервер смог слушать и обрабатывать одновременно "./dserver.sock" ?
Спасибо!ps. тип сокета SOCK_STREAM, возможно использовать нужно другой тип и флаг заработает?
Может вам попробовать так:// основной поток серевера
s = socket();
bind(s);
listen(s);
while (1) {
c = accept(s);
// далее создаем поток или выбираем созданный поток из пула потоков
// и отдаем ему c
}Для AF_INET такой вариант работает, не знаю как дело будет с AF_UNIX,
не когда под них не прогал раннее :)
>[оверквотинг удален]
>while (1) {
> c = accept(s);
> // далее создаем поток или выбираем созданный поток из пула
>потоков
> // и отдаем ему c
>}
>
>Для AF_INET такой вариант работает, не знаю как дело будет с AF_UNIX,
>
>не когда под них не прогал раннее :)Спасибо! так получилось все что нужно, теперь главный поток управляющий, а остальные рабочии. Теперь пробую найти докумендация, как сделать именно пул потоков, как вы написали, чтобы не создавать каждый раз новый поток при запросе, а давать сигнал существующему.
> Теперь пробую найти докумендация, как сделать именно пул потоков, как
>вы написали, чтобы не создавать каждый раз новый поток при запросе,
>а давать сигнал существующему.У. Р. Стивенс
UNIX. Разработка сетевых приложений
3-е издание
>> Теперь пробую найти докумендация, как сделать именно пул потоков, как
>>вы написали, чтобы не создавать каждый раз новый поток при запросе,
>>а давать сигнал существующему.
>
>У. Р. Стивенс
>UNIX. Разработка сетевых приложений
>3-е изданиеСпасибо! Нашел, уже читаю, правда только 2-е издание (отсканированое, в очень плохом качестве), 3-его вроде как нет нигде :-( надеюсь разберусь что к чему и примеры там найду. пока что понял, что нужно использовать мьютексы и pthread_cond_t совместно для сигналов созданым ранее потокам. дочернии потоки блокируются, пока родительский поток не подаст сигнал о том, что очередь не пуста. далее разблокируем мьютекс и запускаем поток. как-то так.
>
>Пробую написать мультипоточный демон на си++ использующий для связи клиент-сервер локальные сокеты
>(AF_UNIX). Все потоки сервера должны слушать один и тот же локальный
>адрес, скажем, "./dserver.sock", но сделать bind получается только для одного потока.Используй один сокет для всех потоков.