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)

5
задан Bella 6 July 2010 в 23:46
поделиться

3 ответа

Это, вероятно, означает, что вы не обеспечиваете ожидаемое квитирование или обмен протоколами для сервера, и он закрывает соединение.

Что произойдет, если вы подключитесь по Telnet к той же машине и порту и наберете один и тот же текст?

1
ответ дан 14 December 2019 в 13:26
поделиться

Вам нужно проверить протокол 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'ы сервера)

4
ответ дан 14 December 2019 в 13:26
поделиться

Удаленный хост выдает TCP-сброс (RST) после принятия соединения. Это может произойти по многим причинам, включая:

  • Правила брандмауэра
  • Ошибка удаленного приложения
  • Удаленное приложение просто закрывает соединение
  • и т.д.

Как сказал Джон Уэлдон, попробуйте подключиться по telnet к той же машине и порту и ввести команды вручную.

Кроме того, хороший сниффер проводов (Ethereal, WireShark и т.д.) очень полезен для диагностики такого рода проблем.

1
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: