Python 空闲连接超时

Python 空闲连接超时,python,sockets,asyncore,Python,Sockets,Asyncore,我正在使用asyncore和asynchat模块构建SMTP服务器(我使用smtpd库中的代码构建SMTP服务器),但我遇到了连接超时问题。当我打开到SMTP服务器的telnet连接并将其保留时,尽管没有发生数据交换,但连接已建立。我想设置超时时间,例如30秒,如果客户端没有任何消息,则关闭服务器的空闲连接(否则可能存在容易的DOS漏洞)。我在谷歌上搜索了一个解决方案,阅读了源代码和文档,但没有发现任何有用的东西 谢谢根据asyncore,asyncore.loop()有一个超时参数,默认为30

我正在使用asyncore和asynchat模块构建SMTP服务器(我使用smtpd库中的代码构建SMTP服务器),但我遇到了连接超时问题。当我打开到SMTP服务器的telnet连接并将其保留时,尽管没有发生数据交换,但连接已建立。我想设置超时时间,例如30秒,如果客户端没有任何消息,则关闭服务器的空闲连接(否则可能存在容易的DOS漏洞)。我在谷歌上搜索了一个解决方案,阅读了源代码和文档,但没有发现任何有用的东西


谢谢

根据
asyncore
asyncore.loop()
有一个超时参数,默认为30秒。显然,默认值应该是30秒,您可以尝试使用它来满足您自己的需要

timeout参数为相应的 select()或poll()调用,以秒为单位;默认值为30 秒


好的,上面提到的实际上是
poll()
select()
超时,而不是空闲超时。 根据,您可以攻击asyncore以支持如下超时:

将以下块添加到您自己的
asyncore.poll的副本中,就在e中fd的
之后:
block

#handle timeouts
rw = set(r) + set(w)
now = time.time()
for f in (i for i in rw if i in map):
    map[f].lastdata = now
    for j in (map[i] for i in map if i not in rw):
        if j.timeout+j.lastdata now:
            #timeout!
            j.handle_close()
您需要初始化的.timeout和.lastdata成员 每一个实例,但这不应该那么糟糕(对于一个
不超时,实际上我建议超时1小时或1天。)

我尝试过,但这可能是另一种超时。当我将循环超时设置为任何值时,行为不会改变。我打开一个终端,启动telnet localhost 10025,建立连接,我可以与服务器通信。当我让它保持10分钟,然后返回运行的telnet时,我可以继续通信。哦,真的。我刚读了代码,是
poll()
/
select()
超时。。阅读代码,没有办法实现您想要的开箱即用。我在回答中添加了一个黑客解决方案,但不确定是否要攻击asyncore本身。