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

Исходное сообщение
"Сокет. Ограничение количества ожидающих подключение."

Отправлено blondinka , 24-Апр-09 15:32 
Здравствуйте! Возникла проблема. У сервера необходимо сделать ограничение на очередь ожидающих подключение, т.е. если уже есть подключение, то новое соединение разрывалось. У функции listen() есть параметр,как раз ограничивающий эту очередь,но как я поняла из MAN'а он игнорируется, а это значение берется из файла ОС. Может кто-нибудь знает,как решить эту задачку?

Содержание

Сообщения в этом обсуждении
"Сокет. Ограничение количества ожидающих подключение."
Отправлено ALu , 27-Апр-09 15:40 
>Здравствуйте! Возникла проблема. У сервера необходимо сделать ограничение на очередь ожидающих подключение,
>т.е. если уже есть подключение, то новое соединение разрывалось. У функции
>listen() есть параметр,как раз ограничивающий эту очередь,но как я поняла из
>MAN'а он игнорируется, а это значение берется из файла ОС. Может
>кто-нибудь знает,как решить эту задачку?

Действительно, начиная с ядра 2.2. размер очереди на установление соединений определяется в /proc/sys/net/ipv4/tcp_max_syn_backlog. Программно его можно поменять через sysctl() но
1. Потребуются права суперпользователя.
2. изменение коснётся ВСЕХ tcp-сокетов системы.
А в связи с чем возникла такая задача?


"Сокет. Ограничение количества ожидающих подключение."
Отправлено blondinka , 27-Апр-09 15:51 

Взаимодействие пользователя с ПО на устройстве орзанизовано через сокет(TCP/IP  протокол), необходимо,чтобы при повторном подключении пользователь не находился в очереди ожидающих подключение, а ему выдавалось сообщение об ошибке.
Просто на данный момент при повторном подключении, на т.е. если уже 1 копия программы-клиента запущена где-то, то при запуске второй коннект есть, клиентом отправляются пакеты,но все висит в этой очереди,т.к.уже есть подключение  и в select() передается дескриптор 1 клиента. А как только первое подключение разрывается, то происходит accept() для следующего в очереди...Как-то  так....:)

"Сокет. Ограничение количества ожидающих подключение."
Отправлено ALu , 27-Апр-09 16:15 
>
>Взаимодействие пользователя с ПО на устройстве орзанизовано через сокет(TCP/IP  протокол), необходимо,чтобы
>при повторном подключении пользователь не находился в очереди ожидающих подключение, а
>ему выдавалось сообщение об ошибке.
>Просто на данный момент при повторном подключении, на т.е. если уже 1
>копия программы-клиента запущена где-то, то при запуске второй коннект есть, клиентом
>отправляются пакеты,но все висит в этой очереди,т.к.уже есть подключение  и
>в select() передается дескриптор 1 клиента. А как только первое подключение
>разрывается, то происходит accept() для следующего в очереди...Как-то  так....:)

Может сделать приложение многопоточным? Один поток будет обрабатывать подключения новых клиентов через accept(), а другие работать с уже подключенными клиентами?


"Сокет. Ограничение количества ожидающих подключение."
Отправлено blondinka , 27-Апр-09 16:20 
Да,будет, но пока только на стадии задумки, но даже тогда максимально возможное количество подключений должно быть 2.
На данный момент нужно сделать одно...
И после изменения этого значения, при подключении будет выдадваться ошибка ECONNREFUSED. Я правильно поняла?

"Сокет. Ограничение количества ожидающих подключение."
Отправлено ALu , 27-Апр-09 16:44 
>Да,будет, но пока только на стадии задумки, но даже тогда максимально возможное
>количество подключений должно быть 2.
>На данный момент нужно сделать одно...
>И после изменения этого значения, при подключении будет выдадваться ошибка ECONNREFUSED. Я
>правильно поняла?

Правильно. На практике не проверял, сужу по мануалам.
А клиента вы пишете? Если да - то вам проще будет сделать так:
1. Стартует многопоточный сервер.
2. К нему подключаются два клиента.
3. При подключении 3, 4, 5, .... клиента сервер принимает соединение, отвечает клиенту коротким сообщением об ошибке и закрывает соединение.
4. "Лишний" клиент выдаёт сообщение пользователю.

P.S. Очень похоже на курсовик :))


"Сокет. Ограничение количества ожидающих подключение."
Отправлено blondinka , 27-Апр-09 16:49 
>[оверквотинг удален]
>Правильно. На практике не проверял, сужу по мануалам.
>А клиента вы пишете? Если да - то вам проще будет сделать
>так:
>1. Стартует многопоточный сервер.
>2. К нему подключаются два клиента.
>3. При подключении 3, 4, 5, .... клиента сервер принимает соединение, отвечает
>клиенту коротким сообщением об ошибке и закрывает соединение.
>4. "Лишний" клиент выдаёт сообщение пользователю.
>
>P.S. Очень похоже на курсовик :))

Возможно, но на самом деле гораздо сложнее) Это дорожный контроллер, поэтому к нему большое количество подключений не требуется...Лишние подключения - угроза безопасности))
Клиента тоже я пишу, так и предполагала сделать. Проблема была как раз в ограничении очереди.Спасибо


"Сокет. Ограничение количества ожидающих подключение."
Отправлено angra , 27-Апр-09 17:25 
>в select() передается дескриптор 1 клиента. А как только первое подключение
>разрывается, то происходит accept() для следующего в очереди...Как-то  так....:)

Подсказываю казалось бы очевидное решение. Вместо выбора только первого значения из select обрабатывайте все. То есть получили от select список, прошлись по нему циклом, получили следующий список. Никаких потоков или форков для этого не надо, просто дополнительный цикл в программе.



"Сокет. Ограничение количества ожидающих подключение."
Отправлено blondinka , 27-Апр-09 17:33 
>>в select() передается дескриптор 1 клиента. А как только первое подключение
>>разрывается, то происходит accept() для следующего в очереди...Как-то  так....:)
>
>Подсказываю казалось бы очевидное решение. Вместо выбора только первого значения из select
>обрабатывайте все. То есть получили от select список, прошлись по нему
>циклом, получили следующий список. Никаких потоков или форков для этого не
>надо, просто дополнительный цикл в программе.

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


"Сокет. Ограничение количества ожидающих подключение."
Отправлено angra , 27-Апр-09 17:52 
А что мешает это делать в одном select? Ему как бы фиолетово какие дескрипторы, можете хоть обычные файловые туда запихнуть вперемешку с сокетами. А вообще покажите общую схему работы, ну и используемый ЯП не помешало бы назвать.

"Сокет. Ограничение количества ожидающих подключение."
Отправлено blondinka , 28-Апр-09 10:53 
>А что мешает это делать в одном select? Ему как бы фиолетово
>какие дескрипторы, можете хоть обычные файловые туда запихнуть вперемешку с сокетами.
>А вообще покажите общую схему работы, ну и используемый ЯП не
>помешало бы назвать.

Да я понимаю,что ему все равно, какие дескрипторы передавать. Сервер на си написан.
А общая схема...
создаю секет - ну bind, listen
далее программа крутится в основном цикле - select,
Если подключений нет, то передаю туда дескриптор сервера,как только есть первый пакет передаю клиентский
делаю accept,и работаю с этим подключением
авторизация и клиент(клиент виндовый) нажимает кнопки и я ему отвечаю, перед отправкой в сокет тоже проверяю секет на запись select'ом. Как только пользователь нажал на "выход". Разрывается соединение и ставлю флаг первого пакета.
Ну вот общая схема работы именно с сокетом..