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)
Это, вероятно, означает, что вы не обеспечиваете ожидаемое квитирование или обмен протоколами для сервера, и он закрывает соединение.
Что произойдет, если вы подключитесь по Telnet к той же машине и порту и наберете один и тот же текст?
Вам нужно проверить протокол IRC немного больше; ваша сессия IRC не считается подключенной (сервером), пока не будут выполнены определенные действия, о которых сервер сообщит вашему клиенту, используя коды протокола IRC. И если сервер или сеть заняты, когда вы подключаетесь, то на выполнение этих действий потребуется больше времени.
В этом случае попытка присоединиться к каналу до того, как сервер передаст вам MOTD (сообщение дня), вызовет отключение со стороны сервера. Код протокола окончания MOTD - 376, он указывает, что последовательность IRC-соединения закончена, и вы можете продолжить свою IRC-сессию, например, ввести команды (например, join).
Я бы предложил ввести цикл RECV и отслеживать данные, полученные от сервера, на наличие кода 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'ы сервера)
Удаленный хост выдает TCP-сброс (RST
) после принятия соединения. Это может произойти по многим причинам, включая:
Как сказал Джон Уэлдон, попробуйте подключиться по telnet к той же машине и порту и ввести команды вручную.
Кроме того, хороший сниффер проводов (Ethereal, WireShark и т.д.) очень полезен для диагностики такого рода проблем.