关闭后,imaplib SSL连接在CLOSE_WAIT中挂起

时间:2011-03-10 02:41:54

标签: python ssl tcp imap imaplib

我有一个通过IMAP4_SSL连接到IMAP服务器的python代码,一切正常,直到它尝试用这个关闭连接:

def logout(self):
    "Close the mailbox and logout and set the connection to None"
    try:
        self.connection.close()
        self.connection.logout()
    except e:
        pass
    self.connection = None

这使连接处于CLOSE_WAIT状态:

 tcp       38      0 1.2.3.4:55809        5.6.7.8:993 CLOSE_WAIT  18983/python2.6

长时间存在的地方。 python进程本身是一个长期运行的守护进程,它会定期进行IMAP检查,因此会随着时间的推移而累积。任何想法为什么会发生以及我做错了什么?

1 个答案:

答案 0 :(得分:1)

当CLOSE_WAIT尚未被本地程序关闭时,套接字会挂起。

查看imaplib source,调用self.sock.close()的唯一位置是shutdown()

我的猜测是你需要拨打self.connection.shutdown()

更新:正如布鲁诺所说,logout()致电shutdown()。但是,结构化示例代码的方式如果close()引发了一个异常,那么logout()将被静默跳过...并且shutdown()将不会被调用。我想知道这是不是正在发生的事情。