LINUX.ORG.RU

как в unix-сокете ограничить очередь


0

0

Здравствуйте, Всем. Объясните, пожалуйста, как ограничить очередь запросов на соединение для сервера, который слушает соединение на unix-сокете по tcp протоколу. В функции listen идет ограничение на уже состоявшееся подключение, т.е. CONNECTED ( как я понял из документации). А мне нужно ограничить очередь еще не подключенных запросов только для этого сокета, то есть CONNECTING, не влезая в параметры ядра (/proc/...), что бы при попытке соединения клиента не ставил его в очередь (CONNECTING), а отбрасывал. Можно ли это сделать и как? Если что-то неправильно понимаю, буду признателен за разъяснения. Заранее спасибо за помощь.

anonymous

Re: как в unix-сокете ограничить очередь

Вы неправильно поняли. listen делает именно то, что Вам нужно.

anonymous ()
Ответ на: Re: как в unix-сокете ограничить очередь от anonymous

Re: Re: как в unix-сокете ограничить очередь

Но когда я в listen поставил очередь 1, а в другой раз ноль, то в обоих случаях при одном подключенном клиенте второй клиент не отбивался а ставился в очередь с состоянием CONNECTING в netstat -apn. В доке я читал, что в Linux (вроде начиная с 2.2) listen означает очередь уже подключенных клиентов, а эта очередь ограничивается в ядре (во - нашел: /proc/sys/net/ipv4/tcp_max_syn_backlog). А как это сделать для только одного сокета и не в ядре - не догоняю.

anonymous ()

Re: как в unix-сокете ограничить очередь

Параметр listen - длина очереди клиентов, для которых TCP-соединение уже установлено, но accept ещё не выполнен.

Это разве не то, что нужно?

anonymous ()
Ответ на: Re: как в unix-сокете ограничить очередь от anonymous

Re: Re: как в unix-сокете ограничить очередь

Это значит, что есть сервер с открытым unix-сокетом и задумка такая, что с ним работает в связке один клиент по tcp/ip соединению постоянно подключенный (и только один). А при попытке подключиться к этому серверу другие клиенты должны отбрасываться (например с сообщением об ошибке), соединение не должно устанавливаться вообще никакое (не то что accept, но доже и tcp/ip соединение). Это нужно из соображений безопасности. А так listen ограничивает соединение и accept не делается для второго клиента, но tcp/ip устанавливается и процесс висит в состоянии CONNECTING, а должен отрубаться сразу. Вот видимо tcp_max_syn_backlog и относится к tcp/ip соединениям, но хотелось бы это ограничение сделать только для одного сокета.

anonymous ()

Re: как в unix-сокете ограничить очередь

Непонятно, причём здесь "соображения безопасности", ну да ладно... tcp_max_syn_backlog совсем о другом. Это максимальное число _полуоткрытых_ соединений.

Вариантов несколько: 1) после установки первого соединения запустить ipchains/iptables и заблокировать порт на входящие соединения. 2) не делать accept вообще после первого клиента. Ну повисят соединения. Кому они мешают? 3) Делать accept, но сразу закрывать принятое соединение. Я не пойму, чем это плохо. 4) Закрыть сокет, который выполнил accept. Тоже нормальный вариант.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.