Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2008 16:16:21

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

socket узнать состояние сокета

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

как узнать состояние сокета в python?

по сути - надо проверить, живо ли соединение.



Отредактировано (Ноя. 27, 2008 16:21:24)

Офлайн

#2 Ноя. 27, 2008 19:52:33

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

socket узнать состояние сокета

Никак. “Гарантированность” озвначает лишь, что все несколько стабильней, чем UDP - но не более того.
Соединение может отвалиться по таймауту, но он на разных операционках минут по 10-15 по умолчанию. Видел и больше.
Если по сути - вводи в свой протокол ping, шли его когда нечего делать. На другой стороне засекай время между любыми пришедшими пакетами. Если больше порога - кто-то, возможно, помер.



Офлайн

#3 Ноя. 28, 2008 09:23:45

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

socket узнать состояние сокета

в FTP так и сделано. Через определенное время клиент NOP посылает и ждет ответа на него от сервера.



Офлайн

#4 Ноя. 28, 2008 11:16:51

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

socket узнать состояние сокета

скрипт выполняется под mod_python, он связывается через сокет с демоном
между перезагрузками скрипта, в интерпретаторах mod_python сохраняются объекты соединений (по сути, сокеты)
регулярной перепроверки сокетов по самописному ping-у здесь организовать не получится (оно же: смысла нет)

пытался смотреть через sudo netstat -p -t информацию о tcp соединениях.
когда демон вырубается, и сокеты демона закрываются, но сокеты в интерпретаторах mod_python остаются.
т.е. остаётся 10 соединений с Program name = apache2 и State = CLOSE_WAIT

хотя State = CLOSE_WAIT, но по прошествии времени они не отключаются (видимо, мало ждал).
когда демон подрубается снова, и я делаю перезагрузку скрипта mod_python, то один из этих сокетов apache2 закрывается.

возможно, стоит посмотреть метод poll. Кажется, что он сделан для того, чтобы смотреть события, связанные с дескрипторами



Офлайн

#5 Ноя. 28, 2008 12:57:52

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

socket узнать состояние сокета

а вообще принципиально важно именно TCP соединение?

И что мешает открывать новое соединение в случае перезагрузки скрипта?



Офлайн

#6 Ноя. 28, 2008 13:25:31

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

socket узнать состояние сокета

скрипт mod_python и демон - могут находится на разных машинах. связь между разными машинами идёт по TCP

poll посмотрел, - действительно то, что нужно. при изменении статуса сокета - изменения дескриптора фиксируются.
т.е. создаём poll и регистрируем сокет:

Poll = select.poll()
Poll.register( sock, POLLIN|POLLPRI|POLLERR|POLLHUP )
потом получаем список событий в сокетах:
List = Poll.poll(0.0)
if(len(sockList)!=0):
(sock, event) = sockList[0]
далее обрабатываем event



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version