2010-06-17 15 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) 

, wenn ich diesen Code ausführen ich diesen Fehler ..socket.error: [Errno 10054]

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

es sagt, dass der Fehler in Zeile 16, in data = sck.recv (1024)

Antwort

1

Das bedeutet wahrscheinlich, dass Sie den erwarteten Handshake oder Protokollaustausch für den Server nicht liefern, und es die Verbindung schließt.

Was passiert, wenn Sie mit demselben Computer und demselben Port telnet und denselben Text eingeben?

+0

seine seltsame Ursache es früher vor dem gleichen Code arbeitete, aber ich wieder mit dem Server verbunden und ich fing an, diesen Fehler zu bekommen, ich weiß nicht einmal, warum – SourD

+0

C0d3r: Vielleicht haben sie Server entschieden, dass es nicht Ihren Bot mochte, so jetzt hat es schwarze Liste. Vielleicht haben sie einen Authentifizierungsnachweis hinzugefügt, der nach NICK aber vor anderen Befehlen benötigt wird? Vielleicht hat jemand schon den NICK, und da du versuchst, einem Kanal ohne NICK beizutreten, unterbricht er dich. Wirklich, versuchen Sie die Telnet-Technik und geben Sie die gleichen Befehle ein - das Ergebnis sollte offensichtlich sein. –

1

Der Remote-Host gibt nach dem Akzeptieren der Verbindung einen TCP-Reset (RST) aus. Dies kann für eine Vielzahl von Gründen geschehen, einschließlich:

  • Firewall-Regeln
  • Fernanwendungsfehler
  • Remote-Anwendung einfach schließt die Verbindung
  • usw.

Als John Weldon sagte, Versuchen Sie, die Telnet-Verbindung zur gleichen Maschine und zum gleichen Port herzustellen und die Befehle manuell einzugeben.

Auch ein guter Draht-Sniffer (Ethereal, WireShark, etc.) ist sehr nützlich für die Diagnose dieser Art von Problem.

4

Sie müssen das IRC-Protokoll ein wenig mehr überprüfen; Ihre IRC-Sitzung wird erst dann als verbunden betrachtet (durch den Server), wenn bestimmte Aktionen abgeschlossen wurden und der Server Ihren Client über die Verwendung von IRC-Protokollcodes informiert. Wenn der Server oder das Netzwerk beim Herstellen der Verbindung beschäftigt ist, dauert es länger, bis diese Aktionen abgeschlossen sind.

In diesem Fall würde der Versuch, einem Kanal beizutreten, bevor der Server Ihnen die MOTD (Nachricht des Tages) gegeben hat, eine Trennung vom Server verursachen. Das Ende des MOTD-Protokollcodes ist 376 und zeigt an, dass die IRC-Verbindungssequenz vorüber ist, und Sie können mit Ihrer IRC-Sitzung fortfahren, z. B .: Befehle eingeben (wie Join).

würde ich vorschlagen, eine RECV Schleife Eingabe und Überwachung von Daten vom Server für den IRC-Code 376, bevor Sie empfangen versuchen, einen Kanal zu verbinden, in Perl würde dies ungefähr wie folgt aussehen:

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

Ziemlich schlecht, aber Du hast die Idee richtig? (Bitte beachten Sie, dass es nur notwendig ist, einmal nach 376 zu suchen, sobald Sie gesehen haben, dass Sie verbunden sind und Sie nur die Verbindung aufrechterhalten müssen, indem Sie auf den Server antworten)