socket接收`nothing`:无限循环

时间:2012-08-22 21:36:55

标签: python sockets infinite-loop

我正在研究一个IRC-bot作为一个小Python项目。机器人工作得很好,但很长时间都无法保持连接状态。过了一会儿,它只是将空行打印到终端,然后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

2 个答案:

答案 0 :(得分:1)

引自here

recv返回0字节时,表示另一方已关闭(或正在关闭)连接。您将不会再收到有关此连接的数据。如初。

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

答案 1 :(得分:1)

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