Bruce
Bruce

Reputation: 1380

Timeout for idle connection

I am using asyncore and asynchat modules to build a SMTP server (I used code from smtpd lib to build the SMTP server) but I have a problem with connection timeouts. When I open telnet connection to the SMTP server and leave it so, the connection is established althought no data exchange happens. I want to set timeout e.g 30 seconds and to close the idle connection by server if nothing comes from the client (else there could be an easy DOS vulnerability). I googled for a solution, read source codes and documentation but didn't found anything usable.

Thanks

Upvotes: 0

Views: 2001

Answers (1)

favoretti
favoretti

Reputation: 30167

According to asyncore documentation, asyncore.loop() has a timeout parameter, which defaults to 30 seconds. So apparently default already should be 30 seconds, you can try and play with it to suit your own needs.

The timeout argument sets the timeout parameter for the appropriate select() or poll() call, measured in seconds; the default is 30 seconds.


Ok, the above actually refers to poll() or select() timeout and not the idle timeout. As per this page, you can hack asyncore to support timeouts like this:

Add the following block to your own copy of asyncore.poll just after the for fd in e: block...

#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()

You ARE going to need to initialize .timeout and .lastdata members for every instance, but that shouldn't be so bad (for a socket that doesn't time out, I would actually suggest a 1 hour or 1 day timeout).

Upvotes: 0

Related Questions