2012-09-03 151 views
21

在我的Python腳本,我一直在使用這個命令激活TCP保持連接:如何使用python腳本更改tcp keepalive計時器?

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

我的目標是爲socket連接關閉掉,如果沒有5分鐘傳輸(*)。我在Windows上工作,我的Python腳本只接收和不傳輸任何數據到客戶端程序。

我知道的是,默認情況下,如果沒有傳輸將在那裏2個小時,那麼只有我可以使用try和except關閉連接。我知道,對於Windows,我可以通過註冊表手動減少等待時間。但是有沒有辦法,我可以從我的腳本中修改它? (*)這裏的「無傳輸」是指「在網絡上安靜地吃包」,而不是「我不想傳送任何東西」。

+0

澄清了 「不發送」 的意思。 –

回答

-5

Keepalive是一種用於檢測死連接的TCP協議技巧,用於Telnet服務器。它默認關閉。要更改保持活着的計時器,請使用socket.setsockopt。請參閱https://docs.python.org/2/library/socket.html

+2

你的回答誤導你。 –

+0

荒謬不正 –

+0

即使Windows有這些選項http://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs.85).aspx –

45

可以使用setsockopt()在已打開的套接字上設置TCP keepalive計時器。

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) 

對於windows上的等效選項refer to msdn。 縱觀Python source,看起來你需要設置SO_KEEPALIVEsock.setsockopt類似於在Unix中,[可選?]設置SIO_KEEPALIVE_VALSsock.ioctl

+0

請注意,這裏使用的TCP_ *常量是特定的到Linux。例如,它們在OS/X上不可用 – RobM

+1

osx'man tcp'包含一個選項'TCP_KEEPALIVE',它接受探針之間的秒數,相當於linux中的'TCP_KEEPINTVL'。選項不會在Python 2.7或3.3中導出,但我認爲可以使用正確的整數值「0x10」作爲關鍵字。 –

+0

@DimaTisnek TCP_KEEPINTVL看起來相當,但是你是如何得到那個值爲'0x10'的? –

7

對於Windows,蟒:

這將使插座保持活動,以10秒的保活時間和3秒的保活間隔。

sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000)) 

更多詳細信息here