Я создал клиентские и серверные программы, которые обмениваются данными через сокет TCP.
Когда у меня несколько клиентов, я вижу, что сервер запускает процесс для каждого клиента. Но если мой клиент внезапно выключается, сервер не закрывает соответствующий процесс.
Пожалуйста, помогите обнаружить отключение питания клиента на стороне сервера, чтобы можно было завершить соответствующий процесс.
Проверка, если клиент жив, должна быть выполнена программно, и проверка связи не возможна, потому что это не разрешено брандмауэром
См. Этот документ: https://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html
Из приведенного выше документа, рейтинг от лучшего к худшему:
Преимущества. Протокол более высокого уровня (фактические сообщения) не затрагивается.
К недостаткам. Это требует изменения в программном обеспечении на обеих сторонах соединения, так что это может быть невозможно, если протокол приложения уже указан и неизменен.
Преимущества. Это может быть использовано, если протокол приложения использует неоднородную систему формирования сообщений. В этом случае первое решение не может быть использовано.
К недостаткам. (То же, что и в первом решении). Это требует изменения программного обеспечения на обеих сторонах соединения, поэтому это может быть невозможно, если протокол приложения уже указан и неизменен.
Преимущества. Не требует изменений в протоколе приложения; в ситуациях, когда код на удаленной стороне не может быть изменен, первые два решения не могут быть использованы. Кроме того, это решение вызывает меньше сетевого трафика; это единственное решение, которое не включает отправку пакетов keepalive (то есть «вы все еще там?»).
К недостаткам. В зависимости от протокола, это может привести к разрыву большого количества допустимых соединений.
Преимущества. Как только код для установки параметров keepalive заработает, приложению больше ничего не нужно менять. Все другие решения имеют события таймера, на которые должно реагировать приложение; это «поставь и забудь».
К недостаткам. RFC 1122, раздел 4.2.3.6 указывает, что подтверждения для сообщений активности TCP без данных не могут надежно передаваться маршрутизаторами; это может привести к разрыву действительных соединений. Более того, стеки TCP / IP вообще не обязаны поддерживать пакеты активности (а многие встроенные стеки этого не делают), поэтому это решение может не переводиться на другие платформы.