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’来保持连接