The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Сокет. Ограничение количества ожидающих подключение."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру