2012-11-26 37 views
5

मुझे लिनक्स में सॉकेट के काम को समझने में कुछ समस्याएं हैं।गैर अवरोधक सॉकेट पर टाइमआउट भेजने के लिए कैसे संभव है?

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int)); 
write = write(sockfd, buf, len); 

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

+0

क्या आप स्पष्ट कर सकते हैं कि आप किस परिणाम को प्राप्त करने का प्रयास कर रहे हैं? –

+2

कोई परिणाम नहीं है कि मैं हासिल करने की कोशिश कर रहा हूं, मैंने इस सवाल से सॉकेट के काम को समझने के लिए कहा है और विशेष रूप से SO_SNDTIMEO क्यों मौजूद है? – 0xhacker

+0

यह उत्तर आपको SO_SNDTIMEO समझने में मदद कर सकता है: http://stackoverflow.com/a/4182564/10682 –

उत्तर

6

गैर अवरोधक सॉकेट पर टाइमआउट भेजने के लिए कैसे संभव है?

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

मैंने बहुत सारे कोड को देखा है जो SO_SNDTIMEO का उपयोग करता है।

गैर-अवरोधन मोड में नहीं जब तक कि संबंधित कोड बकवास न हो।

+0

लिनक्स में आप कैसे सुनिश्चित करते हैं कि एक पैकेट भेजने या लिखना यानी अवरुद्ध हो रहा है। कर्नेल को केवल बफर की पूरी लंबाई के लिए एसीके प्राप्त होने पर ही रिटर्न लिखें या भेजें (बफर को एकाधिक टीसीपी पैकेट में विभाजित कर दिया जाएगा) – 0xhacker

+0

@ mc_87 आप नहीं कर सकते। अगर आप एक पावती चाहते हैं तो आपको आवेदन स्तर पर खुद को भेजना होगा। – EJP

+0

तो, तो आवेदन स्तर पर SO_SNDTIMEO कभी भी उपयोगी कैसे होगा जब तक कि मैं अपने अंतिम टीसीपी एके तक ब्लॉक नहीं कर सकता? – 0xhacker

4

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

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

  • कोई संबंधित समस्या नहीं^_^