2013-07-08 4 views
0

Я пишу однопоточный сервер выбора, где пользователь может динамически добавлять сокеты для прослушивания. Проблема в том, что если кто-то хочет добавить сокет для прослушивания, сервер не будет выбирать этот новый сокет, пока что-то не произойдет в одном из других сокетов.Dynamic Select Server

Обходное решение, которое я думал о добавлении фальшивого сокета в список, который я мог бы сигнализировать всякий раз, когда добавлялся новый сокет для прослушивания, чтобы заставить сервер добавить новый список сокетов в список. Это решение кажется мне немного «взломанным», и я хотел знать, есть ли у кого-нибудь идеи.

+0

Вы используете 'accept()' отдельно от 'select()'? Почему бы не принять соединения в 'select()', а также нет проблемы с синхронизацией –

+0

Я принимаю подключения на выбор ... и нет проблем с синхронизацией ... Я не уверен, что ваш комментарий должен делать с моим вопросом? – marler8997

ответ

0

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

Кроме того, вы можете установить значение тайм-аута в вызове сокета. Таким образом, если сервер не занят ответом на запросы, он может при тайм-ауте выполнять некоторые действия с низким приоритетом, такие как удаление устаревших файлов и т. Д.

+0

На самом деле я не использую ни один из сокетов в этом потоке, чтобы сообщить серверу добавить слуховой сокет. Тайм-аут, который вы упомянули, на самом деле не имеет никакого отношения к моему вопросу ... Я ищу способ выставить выбор вызова ... Я мог бы использовать таймаут для этого, но чем дольше тайм-аут, тем больше времени требуется, чтобы добавить слушателя , чем короче, тем больше у вас получилось. В моем случае у меня могут быть очень длительные периоды активности, а затем, когда мне нужно добавить сокет для прослушивания, мне нужно, чтобы он сразу начал принимать. Было бы бессмысленно, если бы этот сервер постоянно проводил опрос в течение недель без каких-либо причин ... – marler8997

+0

Существует три способа выбора pop/return. Сигнал принимается, таймер истекает, или событие происходит на одном из дескрипторов сокета. Если вы предпочитаете использовать сигнал, вы можете использовать HUP. Как вы сообщаете серверу добавить еще один сокет (учитывая, что это один поточный сервер)? –

+0

На самом деле это многопоточная программа, я просто не хотел включать какие-то лишние детали ... но вы упомянули ... получен сигнал? Интересно, есть ли сигнал, который у меня нет? Theres принимает сигнал ... DataAvailable signal ... Write signal ....? О, вы упомянули HUP? Что это? – marler8997

0

Ваше представление о поддельном сокете неплохо. Я бы переименовал его для управления сокетом, потому что вы могли использовать его для отправки различных команд или запросов на сервер. И было бы более реальным, чем опрос с таймаутом select.

Тип разъема управления также может отличаться от другого разъема. Например, было бы проще использовать UDP или unix-domain socket для отправки управляющих сообщений в локальную серверную программу, чем для этого использовать сокет TCP.

+0

Ya, из того, что я видел, похоже, что специальный сокет, используемый для выбора выбранного вызова, может быть лучшим вариантом ... спасибо за то, что помогли подтвердить мои мысли ... – marler8997

0

Вы можете использовать self-pipe trick. У Alex B есть сообщение good answer об этом, вы действительно должны его прочитать.