0

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

谢谢

4

1 回答 1

0

根据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 天超时)。

于 2012-10-13T13:26:43.417 回答