Подтвердить что ты не робот

Python: обнаруживает, когда сокет отключается по какой-либо причине?

Я пишу приложение в Python 2.7.5 с использованием интерфейса raw socket (import socket).

Мне нужно знать, есть ли способ зарегистрировать какое-либо событие или легко протестировать с регулярным интервалом, если соединение сокета TCP все еще подключено и установлено.

Большинство рекомендаций, которые я нашел, говорят о таких вещах, как "просто попробуйте прочитать, если он будет закрыт, вы получите ошибку или нет байтов". Однако иногда я не готов к read, но я все еще хочу знать, закрыт ли сокет, поэтому, например, я могу вручную повторно подключиться сразу.

Кроме того, read ing из сокета будет удалять байты, считанные из буфера, поэтому read просто проверять подключение "liveness" не представляется возможным.

У меня есть фоновый поток для проверки доступности подключения. Этот поток может проверять один раз в секунду, чтобы узнать, живое ли соединение; если он отбрасывается, тогда он может вызывать функцию или задавать переменную или какую-либо другую вещь, чтобы приложение узнало, что соединение закрыто. Знание WHY, которое оно закрыло (reset равным, тайм-аут и т.д.), Было бы еще более полезным....

Любые советы по этому поводу?

4b9b3361

Ответ 1

Используйте select, как показано в этом учебнике http://docs.python.org/2/howto/sockets.html#non-blocking-sockets

Если сокет находится в выходном читаемом списке, вы можете быть как-близко-к-определенному-как-мы-когда-бы-получить-в-этом-бизнесе, что recv на этом сокете что-то вернет. Такая же идея для записываемого списка. Вы сможете что-то отправить. Возможно, не все, что вы хотите, но что-то лучше, чем ничего. (Фактически, любой разумно здоровый сокет будет возвращаться как записываемый - это просто означает, что доступно свободное пространство для исходящей сети.)

... если где-то в этих входных списках сокетов есть тот, который умер отвратительной смерти, выбор не удастся.

Это поток, который я обычно использую

import select
import socket

ip = '127.0.0.1'
port = 80

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect((ip, port))

while True:
    try:
        ready_to_read, ready_to_write, in_error = \
            select.select([conn,], [conn,], [], 5)
    except select.error:
        conn.shutdown(2)    # 0 = done receiving, 1 = done sending, 2 = both
        conn.close()
        # connection error event here, maybe reconnect
        print 'connection error'
        break
    if len(ready_to_read) > 0:
        recv = conn.recv(2048)
        # do stuff with received data
        print 'received:', recv
    if len(ready_to_write) > 0:
        # connection established, send some stuff
        conn.send('some stuff')

Ответ 2

попробуй это:

if len(recv) == 0:
    print("disconnected fired !")