Разъём потерял соединение - PullRequest
2 голосов
/ 23 апреля 2010

Я знаю, что Twisted может сделать это хорошо, но как насчет простого сокета?

Как вы узнали, что вы случайно потеряли соединение в сокете?Мол, если бы мой интернет отключился и вернулся снова.

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Я предполагаю, что вы говорите о TCP.

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

Существует 100 других причин, по которым вы могли потерять соединение (например, межсетевой шлюз NAT решил выбрасывать соединение молча. На другом конце пострадала ядерная бомба. Ваш маршрутизатор сгорел. Парень на другом конце выдернул его сетевой кабель и тд и тп.)

Вот что вы должны сделать, если вам нужно обнаружить мертвые перы / закрытые сокеты и т. Д.:

  • Чтение из сокета или каким-либо другим образом ожидание событий входящих данных на нем. Это позволяет вам определить, когда соединение было изящно закрыто или произошла ошибка (чтение по нему возвращает 0 или -1) - по крайней мере, если другой конец все еще может отправить пакет TCP FIN / RST или ICMP на ваш хост .

  • Запись в розетку - например, отправлять сердцебиение каждые N секунд. Простое чтение из сокета не обнаружит проблему, когда другой конец завершится неудачно. Если этот компьютер отключается, он, очевидно, не может сказать вам, что он это сделал, поэтому вам придется отправить ему что-нибудь и посмотреть, отвечает ли он.

  • Если вы не хотите записывать сердцебиения каждые N секунд, вы можете, по крайней мере, включить поддержку активности TCP - и в конечном итоге вы получите уведомление, если узел мертв. Вы все еще должны читать из сокета, и сообщения активности обычно отправляются каждые 2 часа по умолчанию. Это все же лучше, чем хранить мертвые розетки месяцами.

0 голосов
/ 23 апреля 2010

Если Интернет приходит и уходит на мгновение, вы можете не потерять сеанс TCP.Если вы это сделаете, API сокетов вызовет какое-то исключение, обычно socket.timeout.

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