[英]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.