2012-01-15 18 views
8

जब सॉकेट को select() पर कॉल करके लिखने के लिए ठीक होने के रूप में संकेत दिया जाता है, तो मुझे कैसे पता चलेगा कि मैं ब्लॉक किए बिना कितना डेटा भेज सकता हूं? (पूर्ण भेजने बफ़र्स आदि के मामले में)चयन() का उपयोग करते समय कभी भी ब्लॉक भेज देगा?

select() द्वारा लौटाए गए सेट में शामिल किए जाने को दर्शाता है कि सॉकेट डेटा की कम से कम एक बाइट के लिए तैयार है, और send() तो लिखित बाइट्स की एक छोटी गिनती वापस आ जाएगी?

या जब यह send() पर len पैरामीटर के साथ उपलब्ध बफर स्पेस से बड़ा है तो यह अवरुद्ध होगा? यदि हां, तो मैं अधिकतम राशि कैसे जानूं?

मैं लिनक्स पर नियमित सी सॉकेट का उपयोग कर रहा हूं।

+1

यदि आपका एपीआई इसका समर्थन करता है तो आप 'SO_SNDLOWAT' विकल्प का उपयोग कर सकते हैं। इस तरह आप कम से कम बाइट चुन सकते हैं जिन्हें लिखने योग्य होना चाहिए। दूसरे विकल्प के लिए – cnicutar

उत्तर

5

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

  1. कॉल selectsend के लिए हर कॉल के बाद देखने के लिए और अधिक डेटा भेजा जा सकता है।

  2. सॉकेट को गैर-अवरुद्ध मोड में रखें, और send पर कॉल करें जब तक कि यह EAGAIN या EWOULDBLOCK त्रुटि न दे।

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

+0

+1, जो भी बहुत आम प्रथा होता है। –

+0

2 पसंदीदा क्यों है? मुझे लगता है कि एक स्पष्टीकरण या संदर्भ इस उत्तर में बहुत सुधार करेगा। इसके अलावा, क्या आप दोनों नहीं कर सकते? –

4

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

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