Что происходит с не принятым соединением? - PullRequest
3 голосов
/ 22 января 2009

Предположим, прослушивающий сокет на localhost: 80 и клиент, подключающийся с использованием: telnet localhost 80

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

Проблема, которую я видел при использовании: netstat -a, заключается в том, что было установлено следующее клиентское соединение. Да, я не обрабатываю его, но на системном уровне он отображается как УСТАНОВЛЕННЫЙ, клиент может отправлять данные и, вероятно, вызывать дополнительные издержки в системе.

Единственный способ, которым я вижу, - это продолжать принимать клиентов, но отключать их. Я прав?

Ответы [ 3 ]

4 голосов
/ 22 января 2009

Функция listen() имеет параметр backlog, который указывает, сколько незавершенных сокетов может зависать в ядре операционной системы, ожидая, пока сервер accept() их.

В моей системе Linux на странице руководства для listen() сказано, что большую часть времени клиент будет получать ошибку connection refused - точно так же, как если бы сокет вообще не слушал.

Если вы хотите обрабатывать только одно соединение, это нормально, вы можете просто сделать:

listen(s, 0);
while ((new_fd = accept(s)) >= 0) {
    process(new_fd);
}

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

1 голос
/ 22 января 2009

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

Два других варианта:

Используйте Raw Sockets (если ваша ОС их поддерживает). И вручную обрабатывать TCP-соединения. Это потребует большого количества дополнительного кода и обработки.

Использовать UDP. Это соединения без сохранения состояния, но тогда вам придется принимать / отклонять пакеты, основываясь на чем-то другом. Это не имеет накладных расходов на соединение TCP, хотя. Также вы не сможете использовать такие вещи, как telnet для тестирования.

0 голосов
/ 25 января 2009

Вы должны просто закрыть гнездо прослушивания, когда вы больше не хотите принимать больше подключений, и открыть его снова, когда вы действительно хотите принимать подключения. Журнал ожидания прослушивания вам совсем не поможет, поскольку для «полуоткрытых» соединений стек TCP / IP принял, а прикладная программа еще не приняла.

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