2012-11-19 9 views
10

मेरे पास किसी अन्य सॉफ़्टवेयर घटक की सुविधाओं की जांच के लिए एक पायथन परीक्षण प्रोग्राम है, चलो बाद वाले घटक को परीक्षण (सीओटी) के तहत कॉल करें। पायथन परीक्षण कार्यक्रम एक सतत टीसीपी कनेक्शन के माध्यम से सीओटी से जुड़ा हुआ है। पायथन प्रोग्राम इसके लिए पाइथन सॉकेट एपीआई का उपयोग कर रहा है। अब भौतिक लिंक की विफलता अनुकरण करने के लिए, मैं पाइथन प्रोग्राम को सॉकेट को बंद करना चाहता हूं, लेकिन उचित रूप से डिस्कनेक्ट किए बिना। आईई। मैं किसी भी टीसीपी SYN/ACK/FIN सहित किसी भी टीसीपी चैनल पर कुछ भी नहीं भेजना चाहता हूं। मैं सिर्फ सॉकेट को चुप रहना चाहता हूं। इसे अब रिमोट पैकेट का जवाब नहीं देना चाहिए।पायथन: इसे उचित रूप से बंद किए बिना सॉकेट को कैसे डिस्कनेक्ट करें

यह ऐसा लगता है जितना आसान नहीं है, क्योंकि सॉकेट पर close पर कॉल करने से टीसीपी FIN दूरस्थ अंत तक पैकेट भेजे जाएंगे। (सुंदर डिस्कनेक्शन)। तो मैं किसी भी पैकेट को भेजने के बिना सॉकेट को कैसे मार सकता हूं?

मैं पाइथन प्रोग्राम को बंद नहीं कर सकता, क्योंकि इसे अन्य घटकों के अन्य कनेक्शन बनाए रखने की आवश्यकता है। जानकारी के लिए, सॉकेट एक अलग धागे में चलाता है। तो मैंने थ्रेड को अचानक मारने का सोचा, लेकिन यह भी इतना आसान नहीं है। (Is there any way to kill a Thread in Python?)

कोई विचार?

उत्तर

7

आप उपयोगकर्तालैंड प्रक्रिया से ऐसा नहीं कर सकते क्योंकि इन-कर्नेल नेटवर्क स्टैक में अभी भी संसाधनों और दिए गए टीसीपी कनेक्शन से संबंधित राज्य हैं। यदि आप अपनी पूरी प्रक्रिया को मार देते हैं तो कर्नेल दूसरी तरफ FIN भेजने जा रहा है क्योंकि यह जानता है कि आपकी प्रक्रिया में कौन सी फ़ाइल डिस्क्रिप्टर है और उन्हें ठीक से साफ करने का प्रयास करेगा।

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

+0

निकोलाई, धन्यवाद, मुझे यही संदेह है। बीटीडब्ल्यू, मेरा मतलब आरएसटी के बजाय एफआईएन था। सवाल ठीक किया। – Scrontch

+0

@Scrontch यह उत्तर सही नहीं है। – EJP

0

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

+0

खैर, बीन्स, आदमी :) बीटीडब्ल्यू, जहां तक ​​मैं समझता हूं, "मैं टीसीपी चैनल पर कुछ भी नहीं भेजना चाहता हूं" का अर्थ है 'आरएसटी' नहीं। –

+0

@ निकोलई एनफेटिसोव सहमत हुए। यह उत्तर आपके लिए एक टिप्पणी के रूप में शुरू हुआ, लेकिन यह अंत में एक उत्तर का अधिक होना प्रतीत होता था। शायद यह नहीं है। – EJP

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