2010-06-17 5 views
5
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)에 있다고 말한다

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

= sck.recv을 실행할 때 (1024)

답변

1

아마도 서버에 예상되는 핸드 셰이크 나 프로토콜 교환을 제공하지 않고 연결을 종료하고 있음을 의미합니다.

동일한 기계 및 포트로 텔넷하고 동일한 텍스트를 입력하면 어떻게됩니까?

+0

동일한 코드보다 먼저 작동하는 이상한 원인이 있지만 서버에 다시 연결하면 그 이유를 알지 못한다. 심지어 – SourD

+0

C0d3r : 어쩌면 서버가 봇을 좋아하지 않기로 결정 했으므로 이제는 블랙리스트에 올랐다. 어쩌면 NICK 후에 필요하지만 다른 명령 전에 필요한 인증 정보를 추가했을 수 있습니까? 이미 누군가가 이미 닉을 가지고 있고, 닉이없는 채널에 가입하려고 시도하기 때문에 연결이 끊어 질 수 있습니다. 정말로 telnet 기술을 시도하고 동일한 명령을 입력하십시오. 결과는 분명해야합니다. –

1

원격 호스트가 연결을 수락 한 후 TCP 재설정 (RST)을 실행 중입니다. 이것은 포함하여 많은 이유에 대해 발생할 수 :

  • 방화벽 규칙
  • 원격 응용 프로그램 오류
  • 원격 응용 프로그램이 단순히 연결을 닫습니다
  • 존 웰던 말했듯이

, 동일한 기계 및 포트로 telnetting하고 수동으로 명령을 입력하십시오.

또한 좋은 스니퍼 (Ethereal, WireShark 등)는 이러한 종류의 문제를 진단하는 데 매우 유용합니다.

4

IRC 프로토콜을 조금 더 확인해야합니다. 서버가 클라이언트에게 IRC 프로토콜 코드 사용에 대해 알리는 특정 작업이 완료 될 때까지 IRC 세션은 (서버에 의해) 연결되지 않은 것으로 간주됩니다. 연결 중 서버 또는 네트워크가 사용중인 경우 이러한 작업을 완료하는 데 시간이 오래 걸립니다.

이 경우 서버가 MOTD (오늘의 메시지)를 보내기 전에 채널에 참여하려고 시도하면 서버에서 연결이 끊어집니다. MOTD 프로토콜 코드의 끝은 376이며 IRC 연결 시퀀스가 ​​끝났음을 나타내며 IRC 세션을 진행할 수 있습니다 (예 : join 명령과 같은 명령 입력). 나는 RECV 루프를 입력하고 전에 IRC 코드 (376)의 서버로부터 수신 된 데이터를 모니터링 제안

이 채널에 가입을 시도, 펄이이 같은 뭔가를해야만 보일 것이다

sub chan_join{ 
    while(my $input = <SOCK>){ 
    if($input =~ /376/){ 
     my $talk = "JOIN $channel"; 
     &send_data($talk); 
     &monitor; 
    } 
    else { print "$input"; } 
    } 
} 

예쁜 가난하지만, 아이디어를 얻었습니까? (한 번만 376 번 확인하면됩니다. 연결되면 서버의 PING에 응답하여 연결을 유지해야합니다.)

관련 문제