2010-06-17 9 views
5
import socket, sys 

if len(sys.argv) !=3 : 
print "Usage: ./supabot.py <host> <port>" 
sys.exit(1) 

irc = sys.argv[1] 
port = int(sys.argv[2]) 
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sck.connect((irc, port)) 
sck.send('NICK supaBOT\r\n') 
sck.send('USER supaBOT supaBOT supaBOT :supaBOT Script\r\n') 
sck.send('JOIN #darkunderground' + '\r\n') 
data = '' 
while True: 
     data = sck.recv(1024) 
     if data.find('PING') != -1: 
     sck.send('PONG ' + data.split() [1] + '\r\n') 
     print data 
     elif data.find('!info') != -1: 
      sck.send('PRIVMSG #darkunderground supaBOT v1.0 by sourD' + '\r\n') 


print sck.recv(1024) 

quand je lance ce code je reçois cette erreur ..socket.error: [Errno 10054]

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

il est dit que l'erreur est dans la ligne 16, en données = sck.recv (1024

Répondre

1

Cela signifie probablement que vous ne fournissez pas l'établissement de liaison ou l'échange de protocole attendu pour le serveur et qu'il ferme la connexion. Que se passe-t-il si vous effectuez un telnet sur la même machine et sur le même port et que vous tapez le même texte?

+0

son étrange cause car il travaillait avant le même code, mais je reconnecté au serveur et j'ai commencé à obtenir cette erreur je ne sais même pas pourquoi – SourD

+0

C0d3r: Peut-être que le serveur a décidé qu'il n'a pas aimé votre bot, alors maintenant il a blacklisté. Peut-être qu'ils ont ajouté des informations d'authentification qui sont nécessaires après NICK mais avant les autres commandes? Peut-être que quelqu'un a déjà le NICK, et puisque vous essayez de rejoindre un canal sans NICK, cela vous déconnecte. Vraiment, essayez la technique telnet et tapez les mêmes commandes - le résultat devrait être évident. –

1

L'hôte distant émet une réinitialisation TCP (RST) après avoir accepté la connexion. Cela peut se produire pour beaucoup de raisons, notamment:

  • règles de pare-feu
  • d'erreur d'application à distance
  • application Remote ferme simplement la connexion
  • etc.

Comme John Weldon a dit, Essayez de vous connecter à la même machine et au même port et entrez les commandes manuellement.

En outre, un bon renifleur de fil (Ethereal, WireShark, etc.) est très utile pour diagnostiquer ce genre de problème.

4

Vous devez vérifier un peu plus le protocole IRC; votre session IRC n'est pas considérée connectée (par le serveur) jusqu'à ce que certaines actions soient terminées et que le serveur informe votre client de l'utilisation des codes de protocole IRC. Et si le serveur ou le réseau est occupé lorsque vous vous connectez, cela prendra plus de temps pour que ces actions se terminent. Dans ce cas, tenter de rejoindre un canal avant que le serveur ne vous ait fourni le MOTD (message du jour) provoquerait une déconnexion par le serveur. La fin du code de protocole MOTD est 376 et indique que la séquence de connexion IRC est terminée, et vous pouvez poursuivre votre session IRC par exemple: entrez des commandes (comme join).

Je suggère d'entrer une boucle de RECV et surveillance des données reçues du serveur pour le code IRC 376 avant de tenter de se joindre à un canal, en Perl ce regarderait somthing comme ceci:

sub chan_join{ 
    while(my $input = <SOCK>){ 
    if($input =~ /376/){ 
     my $talk = "JOIN $channel"; 
     &send_data($talk); 
     &monitor; 
    } 
    else { print "$input"; } 
    } 
} 

assez pauvre mais vous avez l'idée, n'est-ce pas? (S'il vous plaît noter que c'est seulement nécessaire de vérifier 376 une fois, une fois vu vous êtes connecté et vous avez seulement besoin de maintenir la connexion en répondant au serveur 'PING)