2012-10-13 111 views
0

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

由于

回答

0

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

+0

我试过了,但这可能是其他类型的超时。当我将循环超时设置为任何值时,行为不会改变。我打开一个终端,启动telnet localhost 10025,连接建立,我可以与服务器通信。当我将它放置10分钟并返回到正在运行的telnet时,我可以继续进行通信。 – Bruce

+0

哦的确如此。我只是读了代码,它是'poll()'/'select()'超时。读取代码,没有办法实现你想要的现成的。我在我的回答中添加了一个hacky解决方案,但不确定是否要破解asyncore本身。 – favoretti