空闲连接超时

时间:2012-10-13 13:13:17

标签: python sockets asyncore

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

由于

1 个答案:

答案 0 :(得分:0)

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

  

timeout参数设置适当的超时参数   select()或poll()调用,以秒为单位;默认值为30   秒。


好的,上面实际上是指poll()select()超时,而不是空闲超时。 根据{{​​3}},你可以破解asyncore以支持这样的超时:

asyncore.poll区块之后,将以下区块添加到您自己的for fd in e:副本...

#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天。