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

當運行此代碼我得到這個錯誤..socket.error:[錯誤10054]

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

它說,錯誤是在第16行,在數據= sck.recv(1024 )

回答

1

這可能意味着您沒有爲服務器提供預期的握手或協議交換,並且正在關閉連接。

如果您telnet到相同的機器和端口並鍵入相同的文本,會發生什麼情況?

+0

其奇怪的原因它曾用於在相同的代碼之前工作,但我重新連接到服務器,我開始得到那個錯誤,我甚至不知道爲什麼 – SourD 2010-06-17 10:52:44

+0

C0d3r:也許他們的服務器決定它不喜歡你的機器人,所以現在它已被列入黑名單。也許他們添加了一些在NICK之後但在其他命令之前需要的認證證書?也許有人已經得到了NICK,並且因爲您嘗試在沒有NICK的情況下加入某個頻道,它會將您斷開。真的,嘗試telnet技術並輸入相同的命令 - 結果應該很明顯。 – 2010-06-20 13:18:27

1

接受連接後,遠程主機發出TCP重置(RST)。發生這種情況的原因有很多,其中包括:

  • 防火牆規則
  • 遠程應用程序錯誤
  • 遠程應用程序直接關閉連接

正如約翰·韋爾登說,嘗試telnet到同一臺機器和端口並手動輸入命令。另外,一個好的線嗅探器(Ethereal,WireShark等)對診斷這類問題非常有用。

4

您需要稍微檢查一下IRC協議;您的IRC會話不會被視爲連接(由服務器),直到某些操作完成後服務器將通知您的客戶有關使用IRC協議代碼。如果服務器或網絡在連接時處於繁忙狀態,則完成這些操作需要更長的時間。

在這種情況下,在服務器向您提供MOTD(當天的消息)之前試圖加入一個通道會導致服務器斷開連接。 MOTD協議代碼的結尾是376,表示IRC連接順序已經結束,您可以繼續進行IRC會話,例如:輸入命令(如連接)。

我會建議進入RECV循環在你面前監控從服務器接收的IRC代碼376的數據試圖加入一個通道,在Perl這看起來財產以後這樣的:

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

相當差,但你明白了嗎? (請注意,它只需要檢查一次376,一旦看到你已連接,並且你只需要通過響應服務器的PING來維持連接)

相關問題