Нет причин делать какие-либо хитрые трюки с тайм-аутом, пока ваше соединение все еще работает. Если длина данных, возвращаемых из recv
, равна 0, соединение TCP было закрыто.
data = irc.recv(4096)
if len(data) == 0:
# connection closed
pass
Я подозреваю, что recv () также может выдать исключение, если соединение не было завершено без ошибок.
Edit:
Я не уверен, чего вы пытаетесь достичь. IRC-сервер время от времени отправляет вам PING
. Если вы не ответите PONG
, сервер отключит вас. Когда сервер отключит вас, ваш вызов recv()
вернет строку длины 0.
Все, что вам нужно сделать, это ответить на PING
, когда вы его получите, и обработать, если произойдет разрыв соединения.
Ваша логика должна выглядеть примерно так:
keep_trying_to_connect = True
while keep_trying_to_connect:
# try to connect
irc = socket.socket()
# send NICK, USER, JOIN here
# now we're connected and authenticated start your recv() loop
while True:
data = irc.recv(4096)
if len(data) == 0:
# disconnected, break out of recv loop and try to reconnect
break
# otherwise, check what the data was, handling PING, PRIVMSG, etc.
Еще одна вещь, которую нужно иметь в виду, это то, что вам нужно буферизовать все полученные данные, пока вы не получите последовательность \r\n
, вы не всегда будете получать ровно одно законченное сообщение одновременно; Вы можете получить половину одной, или трех, или трех с половиной строк.