Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change tcp keepalive timer using python script?

In my python script, I have activate TCP Keepalive using this command:

x = s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 

My goal is for socket connection to get closed, if there is no transmission(*) for 5 minutes. I am working on Windows and my python script is only receiving and not transmitting any data to client program.

What I know is, by default, if no transmission will be there for 2 hours, then only I can close the connection using try and except. I know, for windows, I can manually reduce this waiting time by going to registry. But is there is a way by which, I can modify it from my script?

(*) here "no transmission" means "something quietly eats packets on the network" rather than "I'm not trying to send anything."

like image 911
John Avatar asked Sep 03 '12 12:09

John


People also ask

How do I configure keepalive?

To configure the Keepalive settings, complete the following steps: Navigate to Setting > Configuration > Keepalive. Turn on Keepalive to enable the configurations.

What is TCP keepalive time?

The TCP Keepalive Timer feature provides a mechanism to identify dead connections. When a TCP connection on a routing device is idle for too long, the device sends a TCP keepalive packet to the peer with only the Acknowledgment (ACK) flag turned on.

What is the default value of the TCP keepalive timer?

The default is 300 seconds. The Keep Alive Interval setting in the TCP profile is used to adjust the frequency at which the BIG-IP system sends TCP Keep-Alive packets to a remote host for connection validation.


1 Answers

You can set the TCP keepalive timers on an already-open socket using setsockopt().

import socket  def set_keepalive_linux(sock, after_idle_sec=1, interval_sec=3, max_fails=5):     """Set TCP keepalive on an open socket.      It activates after 1 second (after_idle_sec) of idleness,     then sends a keepalive ping once every 3 seconds (interval_sec),     and closes the connection after 5 failed ping (max_fails), or 15 seconds     """     sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)     sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, after_idle_sec)     sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval_sec)     sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, max_fails)  def set_keepalive_osx(sock, after_idle_sec=1, interval_sec=3, max_fails=5):     """Set TCP keepalive on an open socket.      sends a keepalive ping once every 3 seconds (interval_sec)     """     # scraped from /usr/include, not exported by python's socket module     TCP_KEEPALIVE = 0x10     sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)     sock.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec) 

For equivalent options on windows refer to msdn. Looking through the Python source, it seems you need to set SO_KEEPALIVE with sock.setsockopt similar to in Unix, and [optionally?] set SIO_KEEPALIVE_VALS with sock.ioctl.

like image 109
Will Pierce Avatar answered Sep 23 '22 09:09

Will Pierce