Найти - Пользователи
Полная версия: socket узнать состояние сокета
Начало » Network » socket узнать состояние сокета
1
axe
на сколько я в курсе, на уровне операционной системы, сокеты обеспечивают гарантированную передачу данных по TCP, поэтому у них должен быть атрибут, соообщающий состояние сокета.

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

по сути - надо проверить, живо ли соединение.
Андрей Светлов
Никак. “Гарантированность” озвначает лишь, что все несколько стабильней, чем UDP - но не более того.
Соединение может отвалиться по таймауту, но он на разных операционках минут по 10-15 по умолчанию. Видел и больше.
Если по сути - вводи в свой протокол ping, шли его когда нечего делать. На другой стороне засекай время между любыми пришедшими пакетами. Если больше порога - кто-то, возможно, помер.
ice
в FTP так и сделано. Через определенное время клиент NOP посылает и ждет ответа на него от сервера.
axe
скрипт выполняется под 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. Кажется, что он сделан для того, чтобы смотреть события, связанные с дескрипторами
ice
а вообще принципиально важно именно TCP соединение?

И что мешает открывать новое соединение в случае перезагрузки скрипта?
axe
скрипт 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
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