2009-08-03 19 views
10

मैंने ट्यूटोरियल के माध्यम से बूस्ट एएसओ संदर्भ पढ़ा है और कुछ उदाहरणों को देखा है। फिर भी, मैं यह देखने में असमर्थ हूं कि सॉकेट कैसे टूटा जाना चाहिए:किसी को कैसे बढ़ावा देना चाहिए :: asio :: ip :: udp :: सॉकेट?

  1. क्या मुझे नज़दीक() या सॉकेट के विनाशक द्वारा किया जाना चाहिए?
  2. मुझे शटडाउन कब कॉल करना चाहिए()
  3. शटडाउन() के प्रभाव क्या हैं? मुझे पता है कि यह "भेजता है या प्राप्त करता है", लेकिन यह कैसे किया जाता है? यदि मैं निष्क्रिय होने के बाद सॉकेट का उपयोग करके भेजता हूं या प्राप्त करता हूं तो मैं क्या उम्मीद कर सकता हूं?
  4. कौन सा त्रुटियों मैं पास() से उम्मीद कर सकते हैं

उत्तर

10

इस के बाद से, एक बहु सवाल यह है कि मैं अपनी संतुष्टि के लिए प्रत्येक भाग का जवाब देने की मेरी पूरी कोशिश करेंगे:

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

चूंकि बूस्ट के डिजाइनरों ने इसे टीसीपी सॉकेट के लिए ध्यान में रखा, इसलिए मुझे लगता है कि वे यूडीपी सॉकेट के लिए ऐसा नहीं करेंगे।

2) shutdown() पर कॉल करें जब आपको लगता है कि किसी भी कोड को भविष्य में recv और/या send सॉकेट पर करने से रोकने के लिए आवश्यक है। यह आम तौर पर आवश्यक नहीं है, हालांकि मैंने इसे देखा है जब यह बंद होने पर RST भेजने के लिए सॉकेट को मजबूर करने के लिए टीसीपी सॉकेट पर उपयोग किया जाता है (लंबित "सुंदर" शटडाउन के विपरीत जहां लंबित भेज संसाधित होते हैं)।

3) आप सॉकेट को दो-चैनल संचार के रूप में सोच सकते हैं: एक पढ़ने के लिए, दूसरा भेजने के लिए। आप किसी एक को दूसरे से स्वतंत्र रूप से बंद कर सकते हैं, और जब आप बंद हो जाते हैं तो आप एक चैनल का उपयोग करना जारी रख सकते हैं (यानी आप अभी भी भेजने के लिए बंद करने के बाद प्राप्त कर सकते हैं और इसके विपरीत)। एक सॉकेट बंद करना दोनों recv पर शट डाउन कॉल करने और भेजने के समान है।

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

इसी तरह भेजने के लिए बंद करना आपके कोड को और डेटा भेजने से रोकता है। अगर स्मृति सही ढंग से मेरी सेवा करती है, तो यह लगता है कि जब आप सॉकेट बंद करते हैं तो क्या होता है (एक शून्य-लंबाई पैकेट को दूसरी तरफ सिग्नल करने के लिए भेजा जाता है जिसे विशेष चैनल बंद कर दिया गया है)। भेजने के लिए कोई भी भविष्य प्रयास एक त्रुटि लौटाएगा।

4) आपको निश्चित रूप से जानने के लिए अपने दस्तावेज़ों को देखना होगा। MSDN आपको एक बहुत अच्छा संकेत देगा, हालांकि मुझे नहीं पता कि मैं इसे आधिकारिक मानता हूं।

+0

धन्यवाद, मैं इस में से कुछ पता चल गया है, लेकिन अभी भी अनिश्चित पास() वास्तव में सॉकेट नाशक में कहा जाता है कि क्या कर रहा हूँ। जो मैंने वास्तव में नहीं किया था वह बूस्ट एएसओ और पारंपरिक नेटवर्क प्रोग्रामिंग के बीच घनिष्ठ संबंध था। शटडाउन() और एमएसडीएन सॉकेट त्रुटि कोडों को देखने के लिए सुझाव दोनों की यह जानकारी बताती है। +1 – Torleif

+0

खुशी मैं मदद कर सकता हूं :) – Brian

+0

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

1

बूस्ट वेबसाइट पर दिए गए उदाहरणों से, ऐसा लगता है कि आपको बस() का उपयोग करना चाहिए।उदाहरण के लिए, यह एक को देखो:

 
void connection::stop() 
{ 
    socket_.close(); 
} 

इस पते से लिया: HTTP Server

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