Найти - Пользователи
Полная версия: активно ли соединение сокета
Начало » Network » активно ли соединение сокета
1
lem
подскажите плз как узать активно ли соединение сокета. (не закрыл ли соединение сервер)
Андрей Светлов
Никак. Это принципиальная особенность tcp сокетов. О них говорим, не так ли?
Вообще-то сокет может послать сообщение о закрытии (метод .shutdown, .close тоже это делает).
Принимающая сторона при попытке писать-читать поймает исключение.
Но есть особенность — при обрыве канала связи (а он может быть длинный, куча хопов) где-то на промежуточном маршрутизаторе приемник ничего не получит.
Он отвалится на таймауте, который вообще-то говоря составляет десятки минут по умолчанию.
Поэтому в разрабатываемых протоколах общения принято использовать короткие пакеты для проверки. Скажем, не было активности в течении тридцати секунд — послать пинг. И если еще за тридцать секунд не пришел понг или иной пакет — соединение считается разорваным.
Такой способ выполняет и вторую важную функцию.
Дело в том, что маршрутизаторы имеют дурную привычку рвать канал, по которому долго ничего не ходит. Считается, что это — полезно, а кроме того «железо» на маршрутизаторах не резиновое (памяти мало и вообще). Бегающие по каналу пинг-понги как раз не позволяют этим устройствам отбросить ненужное.
lem
угумс… спасибочки. кст как послать пинг? (у меня можно просто спец. слово послать, это для ознакомления)
Андрей Светлов
Ммм. Вы как-то общаетесь с другой стороной соединения.
Чаще всего это общение оформляется в виде каких-то пакетов: длина в байтах, тип, содержимое.
Структура пакета — на усмотрение программиста.
Можно и проще. Строчками, например. Перевод каретки — конец пакета, длина пакета не указывается. HTTP, например, так делает (там на самом деле сложнее устроено, но принцип понятен).
Вам нужно просто что-то периодически посылать на другую сторону. И чтобы та сторона вам отвечала.
Как вы будете это делать — на ваше усмотрение. Посылайте спец слово — и пусть вам отвечают другим спец словом (понял, жив, передаю привет).
Как-то так.
Стандартного механизма для пинг-понга нет, если вы это спрашивали.
lem
это то, спасибо. просто думал, есть какой-то спец-запрос, который спрашивает “а у тебя этот порт открыт, а?”
lem
а как сделать таймаут (хочу закинуьт srv.recv() в цикл с таймаутом)
Андрей Светлов
srv.settimeout(0.5) если у вас блокирующие сокеты.
lem
спасибо, я уже нашел рещение.
import time
time.sleep(0.2)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB