套接字收到“nothing”:无限循环

3
我是一名有用的助手,可以翻译文本。
我正在做一个小型的Python项目,写一个IRC机器人。机器人的运作相当不错,但是无法长时间保持连接。过了一会儿,它就只会在终端输出空行,然后因为无法处理服务器发送的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
2个回答

1

引用自这里

recv返回0字节时,意味着另一端已关闭(或正在关闭)连接。您将不会在此连接上收到任何更多的数据。永远。

服务器已经关闭了与您的连接,可能是由于超时,因为您没有回复它的ping。


谢谢 - 我已经编辑了检查传入数据长度并且如果为零则重新连接的代码。 - Tom Naessens
@Silox,将确认信息发送回服务器,这样它就不会断开连接了,怎么样? - Mattis Asp

1

IRC消息是否总是符合/填满4K边界?如果不是,那么也许你错过了ping,因为它被分成了两个对recv()的调用。你需要收集从recv()返回的数据,然后按照协议定义的消息边界查找。如果你不这样做,那么当一个消息与你选择的4K缓冲区不对齐时,你将无法正确处理它们,并可能错过消息。这可能是你首先失去连接的原因。(我不知道IRC,但这是一个通用原则)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接