2012-01-03 15 views
5

मैं वी.एस. 2008ब्लाक एक अवरोधित विनसॉक स्वीकार() कॉल

तहत विनसॉक उपयोग कर रहा हूँ मैं एक धागा एक अवरुद्ध कॉल के माध्यम से स्वीकार कर भेजे टीसीपी कनेक्शन अनुरोध करने के लिए समर्पित स्वीकार करना होगा()। जब मेरे ऐप को बंद करने का समय आता है, तो मुझे किसी भी तरह से इस थ्रेड को अनवरोधित करने की आवश्यकता होती है ताकि यह अपना शट डाउन काम कर सके और बाहर निकल सके। क्या कोई तरीका है कि मैं स्वीकार कर सकता हूं()?

अगर मैं स्वीकार करने के लिए कोई रास्ता नहीं है तो मैं एक और प्रश्न पोस्ट करूंगा()। यह सवाल है: यदि मैं स्वीकृति() पर अवरुद्ध धागे की कड़ी हत्या करता हूं, तो क्या कुछ बुरा होगा (ओएस डेटा संरचनाओं का भ्रष्टाचार इत्यादि)? यदि आप एक "अभी नहीं" ध्वज की जाँच, और जब यह timesout - -

धन्यवाद, डेव

+1

क्या आप जिस सॉकेट को अवरुद्ध कर रहे हैं उसे बंद नहीं कर सकते? इससे 'स्वीकार() 'वापस आ जाएगा। – tribeca

+0

आईएमई, स्वीकृति() अवरुद्ध होने पर बस ऐप से बाहर निकलना ठीक है। ओएस साफ हो जाएगा और कुछ भी टूटा नहीं जाएगा। यदि आप वास्तव में, बिल्कुल स्पष्ट रूप से साफ करना है, तो अन्य पोस्टर द्वारा सुझाए गए अनुसार, किसी अन्य थ्रेड से सॉकेट को बंद करें। WinSock में –

उत्तर

7

अवरुद्ध accept() अवरुद्ध करने का एकमात्र तरीका किसी अन्य धागे से सुनना सॉकेट बंद करना है। अन्यथा, आपको सुनने के लिए सॉकेट को गैर-अवरुद्ध मोड में डालने की आवश्यकता है और select() (जो टाइमआउट का समर्थन करता है) का पता लगाने के लिए accept() को अवरोधित किए बिना कॉल किया जा सकता है।

+0

मुझे विश्वास है कि यह समाधान एक दौड़ के लिए प्रवण है। वहां खिड़की है जहां एक धागा लूप में है, लेकिन 'चयन() 'से बाहर,' चयन()' के वापसी मूल्य की जांच; दूसरा धागा सफलतापूर्वक 'closesocket()' करता है; तीसरा धागा एक ही संभाल मूल्य के साथ एक नई सॉकेट खुलता है; पहला धागा 'चयन() 'में प्रतीक्षा कर रहा है लेकिन अब एक ही हैंडल मान के साथ एक अलग सॉकेट के लिए। – wilx

+0

यदि आप उल्लेख किए गए 'select()' दृष्टिकोण का उपयोग करते हैं, तो दूसरे थ्रेड को 'closesocket()' कॉल करने की आवश्यकता नहीं है। यह केवल एक सिग्नल सेट कर सकता है कि पहला थ्रेड दिखता है ताकि यह अपनी शुरुआती सुविधा पर अपनी सॉकेट बंद कर सके। 'चयन() 'का उपयोग यह सुनिश्चित करता है कि' स्वीकार()' में 'पहले() 'को' स्वीकार()' को कॉल न करने के द्वारा 'स्वीकार() 'में अनिश्चित रूप से अवरुद्ध नहीं किया गया है। –

0

एक दृष्टिकोण मैं पहले उपयोग किए गए स्वीकार करने के लिए एक टाइमआउट मान() की आपूर्ति के लिए है अगर सेट, आप रुकते हैं - यदि नहीं, तो आप स्वीकार() कॉल के साथ लूप में वापस जाते हैं।

मुझे लगता है कि थ्रेड मारना काम करेगा, लेकिन आपको यह सुनिश्चित करने के लिए सावधान रहना चाहिए कि यह आपका धागा है और, उदाहरण के लिए, .NET थ्रेडपूल थ्रेड नहीं।

संपादित करें: रेमी का अधिकार, और सोचने के लिए कि मैंने जिस स्ट्रक्चर को याद किया है उसे सत्यापित करने के लिए मैंने एक त्वरित Google भी किया - बहुत तेज़ लगता है। लज्जित/आदि।

यदि आप अवरुद्ध अर्थशास्त्र को बनाए रखना चाहते हैं, तो यह सॉकेट को किसी अन्य धागे से बंद करना (या आपके अवरुद्ध धागे को छोड़ना) देखना होगा।

+0

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

+0

धागे को मारना बहुत अधिक पूरा है, जिसमें बहुत अधिक अन्य सामानों को शामिल करने की आवश्यकता होगी। –

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