3

私は小さな Python プロジェクトとして IRC ボットに取り組んでいました。ボットは非常にうまく機能しますが、長時間接続を維持することはできません. しばらくすると、空の行が端末に出力され、ping が実行されます (サーバーからの PING を処理できないため)。

このコードは、受信側を処理します。

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

しばらくすると、ボットは白線を端末に出力するだけで、その理由がわかりません。

完全なコードは、Github で入手できます: https://github.com/Silox/Python-IRC-bot/blob/master/bot.py#L101

4

2 に答える 2

1

IRCメッセージは常に4K境界に適合/埋めますか?そうでない場合は、への2つの呼び出しに分割されているため、pingが欠落している可能性がありますrecv()。から返されたデータを収集してからrecv()、プロトコルで定義されているメッセージ境界を探す必要があります。そうしないと、メッセージが選択した4Kバッファーと整列しない場合、それらが正しく処理されず、メッセージを見逃す可能性があります。これが、そもそも接続を失う理由かもしれません。(私はIRCを知りませんが、これは一般的な原則です)

于 2012-08-22T22:10:05.617 に答える
1

ここから引用:

arecvが0バイトを返す場合、反対側が接続を閉じた(または閉じている途中である)ことを意味します。この接続でこれ以上データを受信することはありません。これまで。

pingに応答していないため、サーバーがタイムアウトしたために、サーバーが接続を閉じました。

于 2012-08-22T21:53:16.097 に答える