Форум сайта python.su
на сколько я в курсе, на уровне операционной системы, сокеты обеспечивают гарантированную передачу данных по TCP, поэтому у них должен быть атрибут, соообщающий состояние сокета.
как узнать состояние сокета в python?
по сути - надо проверить, живо ли соединение.
Отредактировано (Ноя. 27, 2008 16:21:24)
Офлайн
Никак. “Гарантированность” озвначает лишь, что все несколько стабильней, чем UDP - но не более того.
Соединение может отвалиться по таймауту, но он на разных операционках минут по 10-15 по умолчанию. Видел и больше.
Если по сути - вводи в свой протокол ping, шли его когда нечего делать. На другой стороне засекай время между любыми пришедшими пакетами. Если больше порога - кто-то, возможно, помер.
Офлайн
в FTP так и сделано. Через определенное время клиент NOP посылает и ждет ответа на него от сервера.
Офлайн
скрипт выполняется под 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. Кажется, что он сделан для того, чтобы смотреть события, связанные с дескрипторами
Офлайн
а вообще принципиально важно именно TCP соединение?
И что мешает открывать новое соединение в случае перезагрузки скрипта?
Офлайн
скрипт 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]
Офлайн