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)
中答案 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等)对于诊断此类问题非常有用。