python – 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] An existing connection was forcibly closed by the remote host

它说错误在第16行,在data = 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’来保持连接

上一篇:java – 使用STARTTLS将套接字升级到SSLSocket:recv失败


下一篇:Taro小程序分享好友和朋友圈功能