Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2011 16:13:19

lem
От:
Зарегистрирован: 2011-05-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

активно ли соединение сокета

подскажите плз как узать активно ли соединение сокета. (не закрыл ли соединение сервер)



Офлайн

#2 Май 12, 2011 16:27:34

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

активно ли соединение сокета

Никак. Это принципиальная особенность tcp сокетов. О них говорим, не так ли?
Вообще-то сокет может послать сообщение о закрытии (метод .shutdown, .close тоже это делает).
Принимающая сторона при попытке писать-читать поймает исключение.
Но есть особенность — при обрыве канала связи (а он может быть длинный, куча хопов) где-то на промежуточном маршрутизаторе приемник ничего не получит.
Он отвалится на таймауте, который вообще-то говоря составляет десятки минут по умолчанию.
Поэтому в разрабатываемых протоколах общения принято использовать короткие пакеты для проверки. Скажем, не было активности в течении тридцати секунд — послать пинг. И если еще за тридцать секунд не пришел понг или иной пакет — соединение считается разорваным.
Такой способ выполняет и вторую важную функцию.
Дело в том, что маршрутизаторы имеют дурную привычку рвать канал, по которому долго ничего не ходит. Считается, что это — полезно, а кроме того «железо» на маршрутизаторах не резиновое (памяти мало и вообще). Бегающие по каналу пинг-понги как раз не позволяют этим устройствам отбросить ненужное.



Офлайн

#3 Май 12, 2011 16:53:43

lem
От:
Зарегистрирован: 2011-05-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

активно ли соединение сокета

угумс… спасибочки. кст как послать пинг? (у меня можно просто спец. слово послать, это для ознакомления)



Офлайн

#4 Май 12, 2011 17:01:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

активно ли соединение сокета

Ммм. Вы как-то общаетесь с другой стороной соединения.
Чаще всего это общение оформляется в виде каких-то пакетов: длина в байтах, тип, содержимое.
Структура пакета — на усмотрение программиста.
Можно и проще. Строчками, например. Перевод каретки — конец пакета, длина пакета не указывается. HTTP, например, так делает (там на самом деле сложнее устроено, но принцип понятен).
Вам нужно просто что-то периодически посылать на другую сторону. И чтобы та сторона вам отвечала.
Как вы будете это делать — на ваше усмотрение. Посылайте спец слово — и пусть вам отвечают другим спец словом (понял, жив, передаю привет).
Как-то так.
Стандартного механизма для пинг-понга нет, если вы это спрашивали.



Офлайн

#5 Май 12, 2011 17:57:10

lem
От:
Зарегистрирован: 2011-05-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

активно ли соединение сокета

это то, спасибо. просто думал, есть какой-то спец-запрос, который спрашивает “а у тебя этот порт открыт, а?”



Офлайн

#6 Май 12, 2011 17:58:23

lem
От:
Зарегистрирован: 2011-05-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

активно ли соединение сокета

а как сделать таймаут (хочу закинуьт srv.recv() в цикл с таймаутом)



Офлайн

#7 Май 13, 2011 11:53:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

активно ли соединение сокета

srv.settimeout(0.5) если у вас блокирующие сокеты.



Офлайн

#8 Май 13, 2011 21:18:48

lem
От:
Зарегистрирован: 2011-05-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

активно ли соединение сокета

спасибо, я уже нашел рещение.
import time
time.sleep(0.2)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version