socket.error:[Errno 10054]

时间:2010-06-17 04:46:54

标签: python sockets network-protocols irc

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行,在data = sck.recv(1024)

3 个答案:

答案 0 :(得分: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'来保持连接)

答案 1 :(得分:1)

这可能意味着您没有为服务器提供预期的握手或协议交换,而且它正在关闭连接。

如果您telnet到同一台机器和端口并输入相同的文本会发生什么?

答案 2 :(得分:1)

远程主机在接受连接后发出TCP重置(RST)。出现这种情况的原因很多,包括:

  • 防火墙规则
  • 远程应用程序错误
  • 远程应用程序只是关闭连接

正如John Weldon所说,尝试远程登录到同一台机器和端口并手动输入命令。

此外,良好的线控嗅探器(Ethereal,WireShark等)对于诊断此类问题非常有用。

相关问题