繁体   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