Как я могу определить на стороне клиента / сервера, что другая сторона потеряла свое сетевое соединение?

Я использую Winsock2, и я сделал сокет TCP через IPv4.

Я знаю, как определить, закрыто ли соединение с одной стороны (проверка значения функции recv), но что, если сторона теряет свое интернет-соединение?

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

-1

Решение

Вполне возможно, что вам нужно как минимум узнать о модели OSI, прежде чем задавать этот вопрос.
TCP, IPv4 не имеют ничего общего со средой (Ethernet, интернет), они заключены в нее. Я имею в виду, что вы имели в виду случай разрыва соединения (так называемое полуоткрытое соединение). TCP использует трехсторонний процесс рукопожатия и четырехстороннее закрытие соединения. После установления соединения, если ни одна из сторон не отправляет данные, пакеты не будут пересекать используемую среду. TCP является протоколом бездействия, на его уровне нет сообщения «пульса», отправляемого с клиента на сервер.

TCP был разработан таким образом, чтобы обеспечить устойчивость и эффективность, позволяя отключать и подключать кабели. Эта схема также эффективна, поскольку по сети не отправляются пакеты «опроса», чтобы просто проверить, существует ли еще соединение. Почему это не всегда работает в реальной жизни? Обычно либо потому, что после повторной инициализации соединения клиентской стороне был назначен новый IP-адрес через DHCP, либо сервер уже пометил это соединение как превышенное по времени. Как серверы это делают? они предполагают, что если клиент простаивает слишком долго, то соединение безопасно закрыть. Клиентское программное обеспечение обычно предназначен для восстановления сеанса, как только это требуется. Некоторые протоколы прикладного уровня, которые требуют более жестких ограничений потока сеансов, используют какие-то периодические пакеты «пульса», также известные как пакеты keep-alive. Есть такие вещи как клиент или сервер протокола ICMP может попробуйте использовать, но есть ограничение к этому, в том числе ограничение ICMP может быть заблокировано маршрутизаторами NAT или некоторыми брандмауэрами.

Существует классический пример случая, когда сердцебиение и тайм-аут не являются частью протокола f: FTP. Он выполнен в виде двух соединений: одно — «командный канал», а другое — для передачи данных. Чтобы не исчерпать пул клиента, FTP-сервер обычно закрывает соединение для передачи данных, если в течение определенного времени команды не отправляются. Что произойдет, если клиент попросит «ПОЛУЧИТЬ» большой файл? Сервер может отключить передачу до ее завершения. Это может быть решено с помощью «пассивного» FTP, где он находится на стороне сервера, который создает соединение для передачи данных в ответ на вход в систему от клиента. Это может быть невозможно, если клиент не может получить соединение, находясь за маршрутизатором. Другое решение состояло в том, что клиент периодически отправляет некоторую «фиктивную» команду, которая не вызывает большого количества трафика, например «PWD» (получить текущую папку).

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]