На каком сокете, clientSocket = accept () или listen (socket), вы устанавливаете SO_KEEPALIVE? - PullRequest
1 голос
/ 19 июня 2010

Какой сокет, clientSocket = accept () или listen (сокет), вы устанавливаете на SO_KEEPALIVE, чтобы соединение с клиентами не прерывалось?

Ответы [ 3 ]

2 голосов
/ 19 июня 2010

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

1 голос
/ 19 июня 2010

SO_KEEPALIVE может работать только на подключенном TCP-сокете (так как для этого требуется отправка пакета по таймеру), который не является прослушивающим сокетом.

Обратите внимание, что эта опция будет не удерживать соединение от сброса (кроме некоторых сломанных брандмауэров, которые удаляют состояния после периода бездействия соединения). Стивенс даже вызывал его ", уведомляя о смерти "вместо.

Посмотрите этот документ HOWTO для более подробной информации.

0 голосов
/ 19 июня 2010

Со страницы man:

Если опция сокета SO_KEEPALIVE включена для установленного TCP-соединения и соединение не используется в течение двух часов, TCP отправляет пакет на удаленный сокет,ожидая, что удаленный TCP подтвердит, что соединение все еще активно.Если удаленный TCP не отвечает своевременно, TCP продолжает отправлять пакеты поддержки активности в соответствии со своим обычным алгоритмом повторной передачи.Если удаленный TCP не отвечает в течение определенного периода времени, TCP разрывает соединение.Следующий системный вызов сокета (например, recv ()) возвращает ошибку, и для errno установлено значение ETIMEDOUT.

Подробную информацию о включении SO_KEEPALIVE можно найти в getsockopt (2).

После периода простоя с одноранговым узлом, в котором не было связи, на удаленный одноранговый узел будет отправлен зонд (небольшой пакет), чтобы проверить, жив ли одноранговый узел или нет.

Если одноранговый узел все еще доступен, будет получено сообщение ACK, поэтому можно сделать вывод, что ссылка все еще включена.Если нет, то партнер умер (на самом деле это немного сложнее, потому что TCP сделает несколько попыток, прежде чем отказаться).

Вы можете настроить опцию как на клиенте, так и на сервере (это означает, чтои сервер, и клиент будут уведомлены о проблемах netowrk).В любом случае на сервере вы установите опцию для сокета, возвращаемого accept().

...