lem
Май 12, 2011 16:13:19
подскажите плз как узать активно ли соединение сокета. (не закрыл ли соединение сервер)
Андрей Светлов
Май 12, 2011 16:27:34
Никак. Это принципиальная особенность tcp сокетов. О них говорим, не так ли?
Вообще-то сокет может послать сообщение о закрытии (метод .shutdown, .close тоже это делает).
Принимающая сторона при попытке писать-читать поймает исключение.
Но есть особенность — при обрыве канала связи (а он может быть длинный, куча хопов) где-то на промежуточном маршрутизаторе приемник ничего не получит.
Он отвалится на таймауте, который вообще-то говоря составляет десятки минут по умолчанию.
Поэтому в разрабатываемых протоколах общения принято использовать короткие пакеты для проверки. Скажем, не было активности в течении тридцати секунд — послать пинг. И если еще за тридцать секунд не пришел понг или иной пакет — соединение считается разорваным.
Такой способ выполняет и вторую важную функцию.
Дело в том, что маршрутизаторы имеют дурную привычку рвать канал, по которому долго ничего не ходит. Считается, что это — полезно, а кроме того «железо» на маршрутизаторах не резиновое (памяти мало и вообще). Бегающие по каналу пинг-понги как раз не позволяют этим устройствам отбросить ненужное.
lem
Май 12, 2011 16:53:43
угумс… спасибочки. кст как послать пинг? (у меня можно просто спец. слово послать, это для ознакомления)
Андрей Светлов
Май 12, 2011 17:01:08
Ммм. Вы как-то общаетесь с другой стороной соединения.
Чаще всего это общение оформляется в виде каких-то пакетов: длина в байтах, тип, содержимое.
Структура пакета — на усмотрение программиста.
Можно и проще. Строчками, например. Перевод каретки — конец пакета, длина пакета не указывается. HTTP, например, так делает (там на самом деле сложнее устроено, но принцип понятен).
Вам нужно просто что-то периодически посылать на другую сторону. И чтобы та сторона вам отвечала.
Как вы будете это делать — на ваше усмотрение. Посылайте спец слово — и пусть вам отвечают другим спец словом (понял, жив, передаю привет).
Как-то так.
Стандартного механизма для пинг-понга нет, если вы это спрашивали.
lem
Май 12, 2011 17:57:10
это то, спасибо. просто думал, есть какой-то спец-запрос, который спрашивает “а у тебя этот порт открыт, а?”
lem
Май 12, 2011 17:58:23
а как сделать таймаут (хочу закинуьт srv.recv() в цикл с таймаутом)
Андрей Светлов
Май 13, 2011 11:53:01
srv.settimeout(0.5) если у вас блокирующие сокеты.
lem
Май 13, 2011 21:18:48
спасибо, я уже нашел рещение.
import time
time.sleep(0.2)