2012-08-22 95 views
3

我正在開發一個IRC-bot作爲一個小型的Python項目。機器人工作得很好,但無法長時間保持連接。過了一段時間,它只是打印終端的emptylines,然後ping出來(因爲它不能處理來自服務器的PING)。套接字接收`nothing`:無限循環

這段代碼處理接收部分:

def listen(channel): 
    while True: 
     data = conn.recv(4096) 
     print data 
     if data != '': 
      if data.split()[0] == 'PING': 
       process the data 

一段時間後,機器人只是打印whitelines到終端,我不知道爲什麼。

完整的代碼可在這裏在Github:https://github.com/Silox/Python-IRC-bot/blob/master/bot.py#L101

回答

1

here引用:

recv返回0字節,這意味着另一側已經關閉(或是在關閉的處理)的連接。您將不會收到有關此連接的更多數據。永遠。

服務器已關閉了您的連接,可能是由於您沒有回覆Ping而導致超時。

+0

謝謝 - 我已經對代碼進行了編輯,檢查傳入數據的長度,並且 - 如果爲零 - 重新連接。 – Silox

+0

@Silox,將ack發送回服務器以便不會斷開連接? –

1

IRC消息是否始終適合/填充4K邊界?如果沒有,那麼也許你錯過了ping,因爲它被分成兩次調用recv()。您需要收集從recv()返回的數據,然後查找協議定義的消息邊界。如果你不這樣做,那麼當一條信息與你選擇的4K緩衝區不一致時,你將不會正確地處理它們,並可能錯過信息。這可能就是爲什麼你首先失去了聯繫。 (我不知道IRC,但這是一個普遍原則)