как серверный сокет знает, что сетевой кабель отключен в Windows с помощью C ++ - PullRequest
1 голос
/ 14 декабря 2011

Я занимаюсь разработкой клиент-серверного приложения в Windows, используя c ++ и winsock lib, оно работает нормально, но если оно находится в сети и после запуска прослушивания сервера, и если я удалю сетевой кабель, то сервер не показывает никаких ошибок ни в одном потоке, так что где сервер сокет знает, что сетевой кабель отключен. если кто-нибудь знает, пожалуйста, помогите мне.

Ответы [ 2 ]

5 голосов
/ 14 декабря 2011

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

Один общий (если не самый распространенный способ решить эту проблему - отправить сообщение «keep-alive».Если в течение некоторого времени не получено ответа на это сообщение, вы просто закрываете соединение и освобождаете все связанные с ним ресурсы.

Edit

Сообщение "keep-alive" похоже на использование "ping"msgstr "команда, чтобы увидеть, можно ли связаться с удалённым компьютером.Это просто сообщение, которое отправляется либо сервером, либо клиентом (не имеет значения, кто его инициирует), чтобы увидеть, если другой конец соединения активен и может быть достигнут.

Можеттак же просто, как отправить строку "Ты здесь?"и ожидая ответа, содержащего «Да, я есть».Если вы отправляете его раз в минуту и ​​не получаете ответа, например, в течение одной минуты, вы можете считать, что соединение разорвано.Другой конец, который получает «Ты здесь?», Знает, что будет получать сообщение раз в минуту.Если он не прибыл в течение двух минут, то отправитель больше недоступен.

Если протокол не может быть изменен для добавления таких сообщений, посмотрите, можно ли использовать какое-то другое сообщение.

Кроме того, помните, что лучший и в некоторых случаях единственный способ узнать, если что-то не так с соединением, это попытаться прочитать из сокета.

4 голосов
/ 14 декабря 2011

Вы можете отключить сеть, а затем снова подключить ее, иначе ноутбук Wi-Fi может на секунду потерять прием, а затем снова включить его. Было бы неприятно, если бы такие повторяющиеся случаи рассматривались как ошибки во всех программах, которые мы используем.

Из этого Winsock "новичок" FAQ :

Предыдущий вопрос касается определения того, когда протокольное соединение прерывается нормально, но что, если вы хотите обнаружить другие проблемы, такие как отключенные сетевые кабели или аварийные рабочие станции? В этих случаях сбой не позволяет уведомить удаленный узел о том, что что-то не так. Мне кажется, что обычно это функция, потому что сломанный компонент может быть исправлен раньше, чем кто-либо заметит, так зачем требовать восстановления соединения?

Если вы чувствуете, что у вас «особые потребности», вы можете быть агрессивны с таймаутами. Но я бы не стал этого делать, если бы не было действительно веской причины.

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