2012-09-03 12 views
21

मेरे अजगर स्क्रिप्ट में, मैं टीसीपी KeepAlive इस आदेश का उपयोग को सक्रिय कर दिया है:पायथन स्क्रिप्ट का उपयोग कर टीसीपी रखरखाव टाइमर कैसे बदलें?

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

मेरा लक्ष्य, सॉकेट कनेक्शन के लिए है बंद कर दिया करने के लिए अगर वहाँ 5 मिनट के लिए कोई प्रसारण (*) है। मैं विंडोज़ पर काम कर रहा हूं और मेरी पायथन लिपि केवल क्लाइंट प्रोग्राम में किसी भी डेटा को प्रेषित और प्रेषित नहीं कर रही है।

मुझे पता है कि डिफ़ॉल्ट रूप से, यदि 2 घंटे के लिए कोई ट्रांसमिशन नहीं होगा, तो केवल मैं कोशिश करके और कनेक्शन को बंद कर कनेक्शन बंद कर सकता हूं। मुझे पता है, विंडोज़ के लिए, मैं रजिस्ट्री पर जाकर मैन्युअल रूप से इस प्रतीक्षा समय को कम कर सकता हूं। लेकिन क्या कोई तरीका है जिसके द्वारा मैं इसे अपनी लिपि से संशोधित कर सकता हूं?

(*) यहां "कोई ट्रांसमिशन" का अर्थ है "मैं कुछ भी भेजने की कोशिश नहीं कर रहा हूं" के बजाय "कुछ चुपचाप नेटवर्क पर पैकेट खाता है"।

+0

स्पष्ट किया है कि "कोई संचरण" का अर्थ है। –

उत्तर

-5

Keepalive मृत कनेक्शन का पता लगाने के लिए एक टीसीपी प्रोटोकॉल चाल है, उदाहरण के लिए एक टेलनेट सर्वर के लिए। यह डिफ़ॉल्ट रूप से बंद है। जीवित टाइमर रखने के लिए socket.setsockopt का उपयोग करें। https://docs.python.org/2/library/socket.html

+2

आपका उत्तर गुमराह। –

+0

बेहद गलत –

+0

यहां तक ​​कि विंडोज़ के पास ये विकल्प हैं http://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs.85).aspx –

45

आप सेटॉकोपट() का उपयोग कर पहले से ही खुली सॉकेट पर टीसीपी रखरखाव टाइमर सेट कर सकते हैं।

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) 

विंडोज refer to msdn पर समकक्ष विकल्पों के लिए। Python source के माध्यम से देखकर, ऐसा लगता है कि आपको sock.setsockopt के साथ यूनिक्स में समान है, और [वैकल्पिक रूप से] SIO_KEEPALIVE_VALSsock.ioctl के साथ सेट करने की आवश्यकता है।

+0

ध्यान दें कि यहां उपयोग किए गए TCP_ * स्थिरांक विशिष्ट हैं लिनक्स के लिए। उदाहरण के लिए वे ओएस/एक्स – RobM

+1

ओएसएक्स 'मैन टीसीपी' में एक विकल्प 'TCP_KEEPALIVE'' पर उपलब्ध नहीं हैं जो जांच के बीच सेकंड स्वीकार करता है, जो कि लिनक्स में' TCP_KEEPINTVL' के बराबर है। विकल्प पायथन 2.7 या 3.3 में निर्यात नहीं किया गया है, लेकिन मुझे लगता है कि सही पूर्णांक मान '0x10' कुंजी के रूप में उपयोग करना संभव है। –

+0

@DimaTisnek TCP_KEEPINTVL बराबर दिखता है, लेकिन आपको यह मान '0x10' कैसे मिला? –

7

खिड़कियों के लिए, अजगर में:

इस सॉकेट सक्षम हो जाएगा, को जीवित रखने के साथ एक 10 दूसरा जिंदा समय रखने के लिए और एक 3 दूसरा जीवित अंतराल रखने के लिए।

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

अधिक विस्तृत जानकारी here

संबंधित मुद्दे