Python : Vérifier si l'IRC de perte de connexion (PING-PONG?)
Donc ma question est, comment puis-je obtenir mon bot pour écouter si il y a une table de PING et si il n'y a pas de ping dans un intervalle d'une minute, il va réagir comme si la connexion a été perdue. Comment pourrait-on faire?
EDIT:
C'est le code de travail pour l'enregistrement de la connexion de fallout (bien qu'ayant de la difficulté avec la reconnexion):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import socket
import string
import os
import platform
import time
# Variables
HOST = "irc.channel.net"
PORT = 6667
NICK = "Botname"
IDENT = "Botname"
REALNAME = os.getenv('USER')
CHAN = "##ChannelName"
readbuffer = ""
# Our IRC connection
irc = socket.socket()
irc.settimeout(300)
connected = False
def connection(host, port, nick, ident, realname, chan):
while connected is False:
try:
irc.connect((host, port))
irc.send("NICK %s\r\n" % nick)
irc.send("USER %s %s bla :%s\r\n" % (ident, host, realname))
irc.send("JOIN :%s\r\n" % chan)
# Initial msg to send when bot connects
irc.send("PRIVMSG %s :%s\r\n" % (chan, "TehBot: "+ nick + " Realname: " + realname + " ."))
global connected
connected = True
except socket.error:
print "Attempting to connect..."
time.sleep(5)
continue
connection(HOST, PORT, NICK, IDENT, REALNAME, CHAN)
while connected:
try:
data = irc.recv ( 4096 )
# If connection is lost
if len(data) == 0:
break
print data
# If Nick is in use
if data.find ( "Nickname is already in use" ) != -1:
NICK = NICK + str(time.time())
connection(HOST, PORT, NICK, IDENT, REALNAME, CHAN)
# Ping Pong so we don't get disconnected
if data[0:4] == "PING":
irc.send ( "PONG " + data.split() [ 1 ] + "\r\n" )
except socket.timeout:
global connected
connected = False
print connected
break
print "Out of loop"
connection(HOST, PORT, NICK, IDENT, REALNAME, CHAN)
- Twisted est un joli cadre.
Vous devez vous connecter pour publier un commentaire.
Cela permettra d'enregistrer le temps à chaque fois qu'il obtient une table de ping, et si il reste trop longtemps sans un, sortir de la
connected
boucle. Vous n'avez pas besoinwhile connected == True:
, justewhile connected:
fait la même chose.Aussi, envisager l'utilisation de
connection
au lieu deConnection
, c'est le Python convention pour l'emploi de noms en majuscule uniquement pour les classes.if data.find ( 'PING' ) != -1:
n'arrive pas. Essayez de changer le seuil, essayez de lancer, dans certainsprint
déclarations, dites-moi exactement ce qui se passe.print
déclaration ci-dessous de la boucle de sorte que vous savez si il a éclaté. 2. Neirc.recv
bloc? Si donc, dès que la connexion est interrompue, vous êtes coincé n'y a jamais d'attente pour 4096 octets que vous n'êtes jamais allez obtenir. Vous avez besoin de définir un délai d'attente si c'est le blocage. Si ce n'est pas le problème, je ne sais pas ce que c'est. Notez que vous n'avez pas tous les deux ont pour définirconnected = False
etbreak
, l'un ou l'autre le fera.Il n'y a pas de raison de le faire toute fantaisie 'timeout' trucs aussi longtemps que votre connexion est toujours active. Si la longueur des données renvoyées par
recv
est 0, la connexion TCP a été fermé.Je soupçonne que recv() peut aussi lever une exception si la connexion n'est pas terminée correctement.
Edit:
Je ne suis pas sûr de ce que vous essayez d'accomplir. Le serveur IRC va vous envoyer un
PING
de temps en temps. Si vous ne répondez pas à unPONG
, le serveur va vous déconnecter. Lorsque le serveur vous déconnecte, puis votrerecv()
appel renvoie un 0-chaîne de longueur.Tout ce que vous avez à faire est de répondre à
PING
lorsque vous l'obtenez, et la poignée si la connexion arrive à fermer.Votre logique devrait ressembler à quelque chose comme ceci:
Une autre chose à garder à l'esprit est que vous avez besoin de tampon toutes les données reçues jusqu'à obtenir une
\r\n
séquence, vous ne serez pas toujours d'obtenir un exactement un message complet dans le même temps, vous pourriez obtenir la moitié de l'un, ou trois, ou trois et un demi-lignes.Vous ne devez pas utiliser
data.find('PING')
car il trouve également le "PING" dans d'autres messages. Et puis vous envoyer le mauvais PONG...Au lieu d'essayer quelque chose comme ça:
if data.startswith('PING'): ...
La raison pour laquelle votre d'avoir des problèmes de reconnexion est parce que une fois que vous faites il n'y a pas de boucle d'écouter pour la réception des données une fois que vous faites, et vous seriez le plus susceptible de ping timeout. La connexion lors de la boucle devrait ressembler à:
Maintenant, quand le temps de connexion à vous reconnecter et de commencer à écouter pour les données entrantes.
REMARQUE: Maintenant qu'il n'y a aucun moyen pour l'application de terminer sur c'est sur, vous devez soit [Ctrl]+[C] dans la ligne de commande, ou de construire une "!quitter" type de commande pour fermer la douille et de la demande... socket d'abord, bien sûr.