2013-06-30 6 views
13

मैं कच्चे सॉकेट इंटरफेस (import socket) का उपयोग कर पायथन 2.7.5 में एक ऐप लिख रहा हूं।पायथन: किसी सॉकेट को डिस्कनेक्ट करते समय पता लगाएं?

मुझे यह जानने की ज़रूरत है कि कोई तरीका है या तो मैं किसी प्रकार का ईवेंट पंजीकृत कर सकता हूं, या एक नियमित अंतराल पर आसानी से परीक्षण कर सकता हूं, अगर कोई टीसीपी सॉकेट कनेक्शन अभी भी जुड़ा हुआ है और स्थापित है।

मुझे मिली अधिकांश सलाहएं कहती हैं कि "बस इसे पढ़ने का प्रयास करें; अगर यह बंद है तो आपको कोई त्रुटि या कोई बाइट नहीं मिलेगा।" हालांकि, कभी-कभी मैं read से इसके लिए तैयार नहीं हूं लेकिन मैं अभी भी जानना चाहता हूं कि सॉकेट बंद हो गया है, इसलिए उदाहरण के लिए मैं मैन्युअल रूप से मैन्युअल रूप से पुनः कनेक्ट कर सकता हूं।

सॉकेट से read आईएनजी बफर से पढ़ने वाले बाइट को हटा देगा, इसलिए कनेक्शन के लिए परीक्षण करने के लिए बस read आईएनजी केवल व्यवहार्य प्रतीत नहीं होता है।

कनेक्शन लचीलापन की जांच करने के लिए पृष्ठभूमि धागा होने के साथ मेरे साथ ठीक रहेगा। यह धागा यह देखने के लिए प्रति सेकंड एक बार कह सकता है कि कनेक्शन लाइव है या नहीं; यदि इसे गिरा दिया गया है, तो यह एक फ़ंक्शन कॉल कर सकता है, या एक चर या कुछ अन्य चीज सेट कर सकता है ताकि ऐप कनेक्शन बंद कर सके। यह जानना क्यों बंद हुआ (सहकर्मी, टाइमआउट, आदि द्वारा रीसेट) और भी उपयोगी होगा ....

इस पर कोई सलाह?

+0

का उपयोग होता है, लिनक्स के लिए 'select() '(या' epoll() 'का उपयोग करें) – tMC

+0

संबंधित: http://stackoverflow.com/questions/17705239/is-there-a-way-to-detect-that-tcp-socket-has -बेन-क्लोज-बाय-द-रिमोट-पीयर-बुद्धि (टीएल; डीआर: यह पता लगाने का कोई अच्छा तरीका नहीं है कि कनेक्शन बंद कर दिया गया है जब तक कि आप पहले सॉकेट से आने वाले सभी बाइट्स को पढ़ने के इच्छुक नहीं हैं; टीसीपी सॉकेट को जानबूझकर इस तरह कार्यान्वित किया जाता है क्योंकि वे फीफो इवेंट ऑर्डरिंग के विचार पर आधारित होते हैं, यानी वे चाहते हैं कि आप इनकमिंग डेटा को क्रम में पढ़ लें, और केवल इसे पढ़ने के बाद स्ट्रीम के अंत के बारे में जानें) –

उत्तर

13

उपयोग select इस ट्यूटोरियल की तरह का सुझाव दिया http://docs.python.org/2/howto/sockets.html#non-blocking-sockets

सॉकेट उत्पादन पठनीय सूची में है, तो आप हो सकता है के रूप में बंद करने के लिए कुछ के रूप में हम-कभी मिलता है-इस में व्यवसाय है कि उस सॉकेट पर एक आरईवी कुछ वापस कर देगा। लिखने योग्य सूची के लिए वही विचार। आप कुछ भेज सकेंगे। शायद आप जो कुछ भी नहीं चाहते हैं, लेकिन कुछ भी कुछ भी बेहतर नहीं है। (असल में, किसी भी उचित स्वस्थ सॉकेट लिखने योग्य के रूप में वापस आ जाएगा - इसका मतलब है कि आउटबाउंड नेटवर्क बफर स्पेस उपलब्ध है।)

... यदि सॉकेट की उन इनपुट सूचियों में कहीं भी एक बुरा मौत हो गई है, तो चयन इच्छा असफल।

इस प्रवाह मैं आमतौर पर Posix पर

import select 
import socket 

ip = '127.0.0.1' 
port = 80 

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
conn.connect((ip, port)) 

while True: 
    try: 
     ready_to_read, ready_to_write, in_error = \ 
      select.select([conn,], [conn,], [], 5) 
    except select.error: 
     conn.shutdown(2) # 0 = done receiving, 1 = done sending, 2 = both 
     conn.close() 
     # connection error event here, maybe reconnect 
     print 'connection error' 
     break 
    if len(ready_to_read) > 0: 
     recv = conn.recv(2048) 
     # do stuff with received data 
     print 'received:', recv 
    if len(ready_to_write) > 0: 
     # connection established, send some stuff 
     conn.send('some stuff') 
संबंधित मुद्दे