簡體   English   中英

socket.error:[Errno 10054]

[英]socket.error: [Errno 10054]

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:[Errno 10054]現有連接被遠程主機強行關閉

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

您需要多檢查一下IRC協議。 在完成某些動作(服務器將通知您的客戶端有關使用IRC協議代碼的操作)之前,您的IRC會話不會被視為(服務器)已連接。 如果服務器或網絡在連接時很忙,則完成這些操作將需要更長的時間。

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

我建議您在嘗試加入頻道之前進入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”來維護連接)

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

如果您通過telnet到同一台計算機和端口並輸入相同的文本,會發生什么情況?

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

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

如John Weldon所說,嘗試遠程登錄到同一台計算機和端口並手動輸入命令。

另外,良好的電線嗅探器(Ethereal,WireShark等)對於診斷此類問題非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM