сервер на 1 соедиение
От: Infineon  
Дата: 31.08.07 09:51
Оценка:
проблема — сервер в Linux, не могу сделать чтобы он поддерживал только одно соединение. Проверяю на 2 клиентах — оба коннектятся.
Хотя accept в сервере не запускается до тех пор пока не обслужится текущее соединение. Но второй клиент коннектится и без accept. А мне нужно чтобы его connect вылетал с ошибкой. Рассмотрел 2 варианта — поставить в listen backlog=1 (не помогло), и закрывать слушающий порт на время обработки соединения (пока не пробовал).
Подскажите что можно сделать
Re: сервер на 1 соедиение
От: Аноним  
Дата: 31.08.07 10:45
Оценка:
Здравствуйте, Infineon, Вы писали:

I>проблема — сервер в Linux, не могу сделать чтобы он поддерживал только одно соединение. Проверяю на 2 клиентах — оба коннектятся.

I>Хотя accept в сервере не запускается до тех пор пока не обслужится текущее соединение. Но второй клиент коннектится и без accept. А мне нужно чтобы его connect вылетал с ошибкой. Рассмотрел 2 варианта — поставить в listen backlog=1 (не помогло), и закрывать слушающий порт на время обработки соединения (пока не пробовал).
I>Подскажите что можно сделать

После accept() закрой прослушиваемый серверный сокет. После обработки снова его открой. И линух тут не причем
Re: сервер на 1 соедиение
От: TarasCo  
Дата: 31.08.07 11:43
Оценка:
Здравствуйте, Infineon, Вы писали:
I>Рассмотрел 2 варианта — поставить в listen backlog=1 (не помогло)

Я честно говоря, не встречал, не пробывал и не уверен, что будет работать, но может попробывать установить backlog = 0? По логике, backlog — это количество соединений, ожидающий обработки. Т.е в Вашем примере ( backlog=1 ) после accept еще одно соединение будет установлено и удержено до следующего вызова accept.
Да пребудет с тобою сила
Re: сервер на 1 соедиение
От: Infineon  
Дата: 31.08.07 11:57
Оценка:
проблему решил действительно путем закрывания слушающего сокета после accept, и открывая его снова после обработки соединения.
Re[2]: сервер на 1 соедиение
От: Michael Chelnokov Украина  
Дата: 31.08.07 12:24
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Я честно говоря, не встречал, не пробывал и не уверен, что будет работать, но может попробывать установить backlog = 0?


Зависит от реализации. Рихтер приводил фактические значения при попытке установить backlog = 0. Почти везде (т.е. во всех распространенных UNIX'ах) получалось 1, в Линуксе — 3. Так что автору явно не поможет.

P.S. Как в Windows — тебе виднее
MSDN молчит...
Re[2]: сервер на 1 соедиение
От: _vvs Россия  
Дата: 31.08.07 12:54
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Я честно говоря, не встречал, не пробывал и не уверен, что будет работать, но может попробывать установить backlog = 0? По логике, backlog — это количество соединений, ожидающий обработки. Т.е в Вашем примере ( backlog=1 ) после accept еще одно соединение будет установлено и удержено до следующего вызова accept.


Когда TCP/IP API только появилось действительно соблюдалось что-то подобное тому, что вы сказали, то есть backlog определял очередь входящих соединений. В последнее время, как я понял, это не совсем так. Это что-то подобное размеру очереди входящих соединений. Поэтому, самый действенный способ, который здесь предложили — это закрывать после успешного accept серверное соединение. После обработки запроса снова открывать его.
Re[3]: сервер на 1 соедиение
От: Michael Chelnokov Украина  
Дата: 31.08.07 14:07
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Рихтер...


Тьфу... Заработался. Стивенс конечно же. Да и не сам Стивенс, а кто-там-модернизировал-его-Network-Programming-до-третьего-издания.
Re[3]: сервер на 1 соедиение
От: Аноним  
Дата: 31.08.07 14:14
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, TarasCo, Вы писали:


TC>>Я честно говоря, не встречал, не пробывал и не уверен, что будет работать, но может попробывать установить backlog = 0?


MC>Зависит от реализации. Рихтер приводил фактические значения при попытке установить backlog = 0. Почти везде (т.е. во всех распространенных UNIX'ах) получалось 1, в Линуксе — 3. Так что автору явно не поможет.


Надо будет на досуге проверить эти самые "3" для линуха, что-то не срастается с маном
Re[3]: сервер на 1 соедиение
От: Аноним  
Дата: 31.08.07 14:36
Оценка:
Здравствуйте, _vvs, Вы писали:

_>Здравствуйте, TarasCo, Вы писали:


TC>>Я честно говоря, не встречал, не пробывал и не уверен, что будет работать, но может попробывать установить backlog = 0? По логике, backlog — это количество соединений, ожидающий обработки. Т.е в Вашем примере ( backlog=1 ) после accept еще одно соединение будет установлено и удержено до следующего вызова accept.


_>Когда TCP/IP API только появилось действительно соблюдалось что-то подобное тому, что вы сказали, то есть backlog определял очередь входящих соединений. В последнее время, как я понял, это не совсем так. Это что-то подобное размеру очереди входящих соединений. Поэтому, самый действенный способ, который здесь предложили — это закрывать после успешного accept серверное соединение. После обработки запроса снова открывать его.


В man listen для Linux в разделе замечания написано про backlog (теперь две очереди).

По поводу способа с реопеном — не особо корректный, но условия задачи не ясны (возможно bad design в самой задаче, не понятно почему нельзя работать обычным образом), поэтому и предложил такой выход, в нем навскидку одна проблема точно есть — если между accept() и close() случиться второе соединение, то оно обломиться у клиента уже после connect() на read/write.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.