我正在使用 asyncore 和 asynchat 模块来构建 SMTP 服务器(我使用 smtpd lib 中的代码来构建 SMTP 服务器),但我遇到了连接超时问题。当我打开与 SMTP 服务器的 telnet 连接并将其保留时,尽管没有发生数据交换,但连接已建立。我想设置超时,例如 30 秒,如果客户端没有任何内容,则关闭服务器的空闲连接(否则可能存在简单的 DOS 漏洞)。我搜索了一个解决方案,阅读了源代码和文档,但没有发现任何可用的东西。
谢谢
根据asyncore
文档,asyncore.loop()
有一个超时参数,默认为 30 秒。所以显然默认已经应该是 30 秒,你可以尝试使用它来满足你自己的需要。
timeout 参数为适当的 select() 或 poll() 调用设置超时参数,以秒为单位;默认值为 30 秒。
好的,上面实际上是指poll()
或select()
超时而不是空闲超时。根据此页面,您可以破解 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 天超时)。