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