ОБНОВЛЕНИЕ: Перейти к ответу, если вы хотите сохранить себе длинную преамбулу.
Соединения TCP/IP KeepAlives указаны не реже одного раза в два часа: http://tools.ietf.org/html/rfc1122#page-101. Проблема в том, что это было написано в 1989 году и беспокоится о стоимости отправки дополнительного пакета KeepAlive! Тем не менее, по-прежнему по умолчанию большинство ОС в соответствии со спецификацией отправляют KeepAlives по подключенному сокету после периода бездействия! Конечно, в настоящее время большинство тайм-аутов соединений до этого, если они неактивны, и если они подключены к одноранговым узлам через интернет-соединения, умирают без вашего ведома до этого (несмотря на то, что они устанавливают тайм-аут выше, чем я подозреваю, потому что таблицы маршрутизаторов между ними не беспокоят это живое - я всегда задавался вопросом, куда просочилось последнее сообщение... ОБНОВЛЕНИЕ: Причиной этого является "маршрутизаторы", которые могут быть на вашем или удаленном узле, являются "stateful" и connect aware и прекратите соединение после некоторого периода бездействия - маршрутизаторы, которые вы просматриваете через Интернет, не могут отказаться от вашего соединения - они им не нужны - пакет просто отправляется туда, куда ему нужно идти). Итак, я видел 2 общих решения для поддержания связи через Интернет:
1) Не обращайте внимания ( EDIT:, как было указано мне, это не игнорирует спецификацию, это просто изменение значения по умолчанию) спецификация и изменение вашего системного интервала KeepAlive до менее чем 2 часов, или 2) реализовать свою собственную систему KeepAlive, периодически опросив сверстников.
В любом случае; какой подходящий период (бездействия для отправки KeepAlive)? Я видел все от 1 секунды до стандартных 2 часов. Кажется, что номер высасывается из превью... Если у меня есть клиентское приложение, связывающее потенциально в любой точке мира, что такое безопасный и разумный период (я хочу одно постоянное соединение)? Соединение с одноранговым узлом много удаляет по другую сторону света через Интернет, соединение замирает на 301 секунду (хотя вы только знаете об этом, когда пытаетесь отправить что-то), поэтому установка периода до 300 секунд кажется магическим числом - Я получаю KeepAlive за 1 секунду до смерти - этот интервал мне никогда не подводил... но это безопасно?
РЕДАКТИРОВАТЬ: Это конкретное соединение im, реализующее в С# 3.0 код в этом приветствии.