2010-08-26 11 views
6

मैं विंडोज़ पर अवरुद्ध सी सॉकेट का उपयोग करता हूं। मैं सर्वर से क्लाइंट के डेटा के अपडेट भेजने के लिए उनका उपयोग करता हूं और इसके विपरीत। मैं एक उच्च आवृत्ति (प्रत्येक 100ms) पर अद्यतन भेजते हैं। क्या send() फ़ंक्शन समाप्त होने से पहले डेटा प्राप्त करने के लिए प्राप्तकर्ता recv() के लिए प्रतीक्षा करेगा?सी सॉकेट: आरईवी के अंत में इंतजार भेजता है?

मैं अगर मैं अच्छी तरह से समझ आदमी पेज नहीं मान: "। भेजने के सफल समापन के() संदेश के वितरण की गारंटी नहीं देता"

तो अगर एक 10 send() आवृत्तियां चल रहा है, जबकि अन्य केवल पूरा 1 recv() है तो क्या होगा?

क्या मुझे किसी प्रकार की स्वीकृति प्रणाली का उपयोग करने की आवश्यकता है?

+0

सॉकेट के प्रोटोकॉल प्रकार क्या है? टीसीपी, यूडीपी, कुछ और? – torak

+0

मैं टीसीपी प्रोटोकॉल का उपयोग करता हूं – Giann

उत्तर

10

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

चूंकि टीसीपी एक गारंटीकृत डिलीवरी प्रोटोकॉल है, इसलिए आउटगोइंग कतार पर डेटा रिमोट एंड द्वारा स्वीकृति मिलने के बाद ही हटाया जा सकता है। ऐसा इसलिए है क्योंकि यदि समय में कोई एक प्राप्त नहीं हुआ है तो डेटा को नाराज होना पड़ सकता है।

यदि रिमोट एंड सुस्त है, तो आउटगोइंग कतार डेटा के साथ भर जाएगी और तब तक ब्लॉक करेगा जब तक आउटगोइंग कतार पर नया डेटा रखने की जगह नहीं है।

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

यूडीपी के लिए, मुझे लगता है कि यह बिना कहने के चला जाता है कि रिपोर्टिंग का कोई तरीका क्या है या प्राप्त नहीं किया गया है।

7

send() ब्लॉक जब तक ऑपरेटिंग सिस्टम (कर्नेल) ने डेटा नहीं लिया है और इसे आउटगोइंग डेटा के बफर में डाल दिया है। यह तब तक इंतजार नहीं करता जब तक दूसरे छोर को डेटा प्राप्त नहीं हुआ हो।

0

यदि आप टीसीपी का उपयोग कर रहे हैं, तो आपको मुफ्त में स्वीकृति मिलती है क्योंकि प्रोटोकॉल हुड के तहत क्या करता है। लेकिन इस तरह के आवेदन के लिए लगता है कि आप शायद यूडीपी का उपयोग करना चाहते हैं। किसी भी मामले में हालांकि send() क्लाइंट सफलतापूर्वक recv() तक अवरुद्ध नहीं होगा।

यदि यह महत्वपूर्ण है कि क्लाइंट प्रत्येक संदेश प्राप्त करे, तो टीसीपी का उपयोग करें। यदि क्लाइंट के लिए एक या अधिक संदेशों को याद करना ठीक है, तो यूडीपी का उपयोग करें।

+1

आपको टीसीपी परत पर एएक्स मिलते हैं, लेकिन अगर आपको एप्लिकेशन लेयर पर एएक्स की आवश्यकता होती है, तो इससे आपकी मदद नहीं होती है, यानी अगर आपको यह पता होना चाहिए कि कोई संदेश प्राप्त हुआ है, तो आपको किसी भी एप्लिकेशन में एएक्स लागू करने की आवश्यकता है प्रोटोकॉल आप उपयोग कर रहे हैं। – nos

2

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

यदि आप यूडीपी का उपयोग कर रहे हैं, तो इनमें से कोई भी सत्य नहीं है - डेटा आदेश से बाहर निकल सकता है, या गिराया जा सकता है और कभी भी वितरित नहीं किया जा सकता है। यदि आप सभी डेटा प्राप्त करने की परवाह करते हैं, तो आपको केवल यूडीपी के शीर्ष पर अपनी खुद की कुछ स्वीकृति प्रणाली बनाने की आवश्यकता है।

बेशक, गारंटी पर एक सीमा है - यदि नेटवर्क केबल काट दिया जाता है (या जो कुछ भी) पैकेट वितरित नहीं किया जाएगा, लेकिन आपको कम से कम एक त्रुटि संदेश मिलेगा जो आपको बताएगा कि कनेक्शन खो गया था।

0

टीसीपी कम टीसीपी स्टैक स्तर पर वितरण की गारंटी देता है। यह तब तक डिलीवरी करता है जब तक प्राप्त करने वाला हिस्सा स्वीकार नहीं करता कि डेटा प्राप्त हुआ था, लेकिन आपका एप्लिकेशन उस तथ्य के बारे में कभी नहीं जानता।

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

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