2011-02-01 3 views
0

저는 재미있게 Python으로 IRC 봇을 만들고 있습니다. '!'접두어가 붙은 명령을 받아 들여야합니다. 그들에게 행동하십시오. 아래 함수는 IRC 메시지에서받은 명령을 구문 분석하는 데 사용됩니다.소켓이 닫힐 때까지 Python socket.send()가 전송되지 않습니다.

def parse_cmd(self, sender): 
    #Admin Commands 
    if sender == self.owner: 
     if self.command == 'quit': 
      send_bufr = "QUIT %s\r\n" %(self.channel) 
      self.sock.send(bytearray(send_bufr, "utf-8")) 
      self.sock.close() 
      sys.exit(1) 
     if self.command == 'hi': 
      print("Run: Hi") 
      send_bufr = "PRIVMSG %s :Hello %s" %(self.channel, sender) 
      print(send_bufr) 
      self.sock.send(bytearray(send_bufr, "utf-8")) 
      return 
     else: 
      return 
    else: 
     return 

느낌표는 이전에 구문 분석되었으며 self.command는 이전에 설정된 명령으로 사용됩니다. 다음 코드는 사용자, 닉을 설정하고, 채널을 결합하는 데 사용되며 self.sock.send 잘 여기에 작동합니다

#Send NICK self.nick to set NICK 
    send_bufr = ("NICK %s \r\n") %(self.nick) 
    self.sock.send(bytearray(send_bufr, "utf-8")) 
    print("Set Nick to %s" %(self.nick)) 

    #Send USER to set USER 
    send_bufr = ("USER %s 8 * :S0lder \r\n") %(self.nick) 
    self.sock.send(bytearray(send_bufr, "utf-8")) 
    print("Set USER to %s 8 :S0lder" %(self.nick)) 

    #JOIN self.channel 
    send_bufr = ("JOIN %s \r\n") %(self.channel) 
    self.sock.send(bytearray(send_bufr, "utf-8")) 
    print("Joined %s" %(self.channel)) 
    time.sleep(5) 

을하지만 기능 이전과 self.sock.send의 인스턴스() '! quit'명령이 제공 될 때까지 초기 연결이 전송 된 후에는 의 모든 메시지가 전송됩니다. 왜 이런거야? 소켓을 사용하는 적절한 방법을 오해하고 있습니까?

편집 : IRC 클라이언트가있는 동일한 채널에 연결되어 있으며! quit 명령을 입력 한 후에야 채널에 메시지가 나타납니다.

+1

수신 코드는 어떻게 생겼습니까? 여기에 문제가있을 수 있습니다. 여기서는 전송 코드가 아닙니다. – payne

+2

IRC를 모르지만 hi 명령에 대한 응답이 문제가있는 것 같습니다. \ r \ n과 같은 터미네이터를 포함하면 안됩니까? –

+0

내 수신 코드는 socket.send() 인쇄 전에 추가 된 디버깅 print() 함수로 제대로 작동합니다. –

답변

1

내 질문에 대한 그의 의견에서 Winston Ewert는 정확했습니다. socket.send는 읽어야 : 내 부분에

send_bufr = "PRIVMSG %s :Hello %s\r\n" %(self.channel, sender) 
print(send_bufr) 
self.sock.send(bytearray(send_bufr, "utf-8")) 

바보 같은 실수는 터미네이터를 생략 할 수 있습니다. 도와 주신 모든 분들께 감사드립니다.

0

보십시오 : 거의 즉시 버퍼를 플래시한다

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 

.

관련 문제