socket.error: [Errno 10054] - PullRequest
       10

socket.error: [Errno 10054]

5 голосов
/ 17 июня 2010
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)

Ответы [ 3 ]

4 голосов
/ 20 июня 2010

Вам нужно немного больше проверить протокол 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 голос
/ 20 июня 2010

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

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

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

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

1 голос
/ 17 июня 2010

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

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

...