我使用asyncore和asynchat模块来构建SMTP服务器(我使用smtpd库中的代码构建SMTP服务器),但我遇到了连接超时的问题。当我打开到SMTP服务器的telnet连接并离开它时,虽然没有数据交换发生,但连接已建立。我想设置超时(例如30秒),并在客户端没有任何内容时通过服务器关闭空闲连接(否则可能存在一个简单的DOS漏洞)。我搜索了一个解决方案,阅读源代码和文档,但没有发现任何可用的东西。空闲连接超时
由于
我使用asyncore和asynchat模块来构建SMTP服务器(我使用smtpd库中的代码构建SMTP服务器),但我遇到了连接超时的问题。当我打开到SMTP服务器的telnet连接并离开它时,虽然没有数据交换发生,但连接已建立。我想设置超时(例如30秒),并在客户端没有任何内容时通过服务器关闭空闲连接(否则可能存在一个简单的DOS漏洞)。我搜索了一个解决方案,阅读源代码和文档,但没有发现任何可用的东西。空闲连接超时
由于
根据asyncore
documentation,asyncore.loop()
具有超时参数,默认为30秒。所以显然默认情况下应该是30秒,你可以尝试和玩它来适应你自己的需求。
timeout参数设置适当的 select()或poll()调用的超时参数,以秒为单位;默认值是30秒 秒。
好的,上述的实际上是指poll()
或select()
超时而不是空闲超时。 按this page,你能砍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天超时)。
我试过了,但这可能是其他类型的超时。当我将循环超时设置为任何值时,行为不会改变。我打开一个终端,启动telnet localhost 10025,连接建立,我可以与服务器通信。当我将它放置10分钟并返回到正在运行的telnet时,我可以继续进行通信。 – Bruce
哦的确如此。我只是读了代码,它是'poll()'/'select()'超时。读取代码,没有办法实现你想要的现成的。我在我的回答中添加了一个hacky解决方案,但不确定是否要破解asyncore本身。 – favoretti