मतदान () 0 टाइमआउट के साथ बुलाए जाने पर आने वाले डेटा को प्रस्तुत करता है

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

क्या यह सामान्य व्यवहार है? क्या मतदान() हमेशा आने वाले डेटा के लिए समय-समय पर कम से कम एक बार जांच करता है?

किसी अन्य प्रश्न में उत्तर के अनुसार, लिनक्स मनुष्य पेज इसके बारे में बहुत स्पष्ट नहीं हैं।

0
शून्य कोडआउट के साथ polin के लिए poll का अर्थ है "यह देखने के लिए कि क्या प्राप्तकर्ता बफर में कोई (वैध) डेटा है, जिसे मैं तुरंत पढ़ सकता हूं, अन्यथा वापस तुरंत "। इसका मतलब यह नहीं है कि "तार पर कोई भी डेटाग्राम आ गया है या सत्यापित करें" या किसी अन्य चीज को सत्यापित करें। क्या आपने सत्यापित किया है कि डेटाग्राम का चेकसम Wireshark द्वारा देखे गए इन डेटाग्रामों के लिए मान्य है और वे उदास नहीं हैं resends? पोल स्पष्ट रूप से ऐसे मामले में पॉलिन की रिपोर्ट नहीं करेगा, क्योंकि प्राप्त बफर में कुछ भी नहीं रखा जाएगा।
जोड़ा लेखक Damon, स्रोत
लिनक्स मैनपेज (मेरी राय में) इसके बारे में भी बहुत स्पष्ट है। poll आने वाले डेटा के लिए कभी भी जांच नहीं करता है, यह उस डेटा के लिए जांच करता है जो आया है (और हाँ, यह हमेशा एक बार जांचता है (अधिक बार नहीं) या यह आपके द्वारा निर्दिष्ट समय के लिए अवरुद्ध)।
जोड़ा लेखक Damon, स्रोत
क्या आप निश्चित हैं कि आप पूरा डेटा देख रहे हैं, यानी डेटा का एक टीसीपी सेगमेंट नहीं, जहां पिछले डेटा खो गया है, और टीसीपी स्टैक इस प्रकार एक रिट्रांसमिशन की प्रतीक्षा कर रहा है? या यदि यह यूडीपी है, तो यूडीपी पैकेट गिरा दिया जा सकता है?
जोड़ा लेखक nos, स्रोत
क्या आप मतदान() कॉल के साथ एक कोड स्निपेट प्रदान कर सकते हैं?
जोड़ा लेखक Michael, स्रोत

1 उत्तर

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

तो ऐसा लगता है कि मतदान() 0 के टाइमआउट के साथ भी ठीक काम करता है।

0
जोड़ा