2012-04-25 7 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो एक प्रेषक से रिसीवर को एक लिंक पर बिंदु बिंदु भेजता है जो सरल (एक तरफ ट्रांसमिशन) या डुप्लेक्स मोड (दो तरफ) में संचालित हो सकता है। सरल मोड में, एप्लिकेशन यूडीपी का उपयोग कर डेटा भेजता है, और डुप्लेक्स में यह टीसीपी का उपयोग करता है। चूंकि टीसीपी सॉकेट पर एक लिखना ब्लॉक हो सकता है, इसलिए हम गैर ब्लॉकिंग आईओ (ioctl FIONBIO - O_NONBLOCK और fcntl के साथ इस वितरण पर समर्थित नहीं हैं) का चयन कर रहे हैं और चयन() सिस्टम कॉल को निर्धारित करने के लिए कि डेटा कब लिखा जा सकता है। एनआईओ का उपयोग किया जाता है ताकि नेटवर्क की स्थिति में बिगड़ने की आवश्यकता होने पर हम समय-समय पर भेजने से बाहर निकल सकते हैं। मैं भेजने के लिए एक ही मूल कोड का उपयोग करना चाहता हूं लेकिन इसके बजाय टीसीपी/यूडीपी के बीच एक उच्च अमूर्तता में बदलना चाहता हूं। यह टीसीपी के लिए बहुत अच्छा काम करता है।अनुरोध किए गए कम बाइट्स के साथ एक गैर अवरुद्ध यूडीपी लिखना वापसी कर सकते हैं?

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

मैं सॉकेट प्रोग्रामिंग के लिए बिल्कुल नया हूं इसलिए कृपया मुझे क्षमा करें यदि कुछ गलत धारणाएं हैं। धन्यवाद।

+0

आप शायद जो भी सिस्टम आप काम कर रहे हैं उसके लिए विवरण जांचना चाहते हैं; आपके यूडीपी स्टैक में विशिष्ट सीमाएं हो सकती हैं (वास्तव में, जैसा कि आपने पहले ही कहा है)। – geekosaur

उत्तर

2

एक सही (टूटी हुई नहीं) यूडीपी कार्यान्वयन मान लिया जाये, तो प्रत्येक/sendmsg/sendto ठीक एक पूरे आंकड़ारेख भेजा है और प्रत्येक recv/recvmsg/recvfrom अनुरूप होगा ठीक एक पूरे आंकड़ारेख प्राप्त करने के लिए के अनुरूप होगा भेजें।

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

अंगूठे का एक अच्छा नियम अपने यूडीपी पेलोड आकार को 1400 बाइट्स पर रखना है। यह बहुत अनुमानित है और विखंडन से बचने के लिए सुरंग के विभिन्न रूपों के लिए बहुत सारे कमरे छोड़ देता है।

+0

धन्यवाद। मैंने कुछ और परीक्षण किया और पाया कि या तो मेरा पूरा पेलोड या इसमें से कोई भी यूडीपी के साथ दिए गए लिखने() कॉल के लिए भेजा जाता है - जो वास्तव में होने वाली एकमात्र तार्किक बात है। मैं VXWorks 5.5 पर एक विक्रेता के साथ एक TOE का समर्थन करने के लिए प्रदान किया गया है ... मुझे आश्चर्य नहीं है कि मुझे लक्ष्य प्लेटफ़ॉर्म पर एक EMSGSIZE नहीं दिखाई देता है। वैसे भी, आधिकारिक प्रतिक्रिया के लिए धन्यवाद, यह निश्चित रूप से विश्वास प्रदान करने में मदद करता है कि मैंने आधार को कवर किया है। – aig7761

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