2011-10-03 13 views
19

मैं अपने सॉकेट के बीच संचार के लिए चुनिंदा फ़ंक्शन का उपयोग कर रहा हूं। मेरे पास थोड़ी देर लूप है और मैं करता हूं -लूप के अंदर चयन() के लिए FD_SET/FD_ZERO क्यों?

while(!done) { 

    FD_ZERO(&read_flags); 
    FD_ZERO(&write_flags); 
    FD_SET(comm_fd1, &read_flags); 
    FD_SET(comm_fd2, &read_flags); 
    FD_SET(STDIN_FILENO, &read_flags); 
    FD_SET(comm_fd1, &write_flags); 
    FD_SET(comm_fd2, &write_flags); 
    FD_SET(STDIN_FILENO, &write_flags); 

    //call select 
    sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd); 

और क्लाइंट पक्ष पर विभिन्न चर के साथ समान है। मुझे यह मूल तकनीक ऑनलाइन ट्यूटोरियल से मिली और बस इसके साथ चला गया। फिर यह मुझे मारा - मैं सेट को साफ़ क्यों करता हूं और जब भी मैं लूप करता हूं तो फाइल डिस्क्रिप्टर जोड़ता हूं? अगर वे पहले ही जोड़े गए हैं, तो उन्हें साफ़ क्यों करें और फिर से जोड़ें? इसलिए मैंने थोड़ी देर पहले ऐसा करने की कोशिश की, और कोड अब भी काम नहीं करता है। क्या कोई समझा सकता है क्यों? क्या यह सिर्फ इसलिए है क्योंकि चयन की सामग्री को संशोधित करता है? किसी भी मदद और/या अंतर्दृष्टि की सराहना की है।

उत्तर

21

जब select रिटर्न, यह सेट दिखाने के लिए सेट किया गया है कि कौन सी फाइल डिस्क्रिप्टर पढ़ने/लिखने/अपवाद के लिए तैयार हो गए हैं। अन्य सभी झंडे को मंजूरी दे दी गई है।

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

पुनः समाशोधन के लिए, यह एक अच्छी आदत हो सकती है, क्योंकि यदि आपको फ़ाइल डिस्क्रिप्टर (जैसे पढ़ने के लिए एक नया खोला सॉकेट जोड़ना) सेट करना है, तो आप चाहेंगे इसे साफ़ करें और इसे हर बार पुनर्निर्मित करें, ताकि यह सही हो क्योंकि प्रोग्राम की स्थिति बदल जाती है।

+2

यह भी ध्यान रखें कि आपको प्रत्येक बार लूप के समय की संरचना (आपके उदाहरण में प्रतीक्षा करें) को रीसेट करना चाहिए। –

3

क्या यह सिर्फ इसलिए है क्योंकि चयन सेट की सामग्री को संशोधित करता है?

हाँ, select रिटर्न के बाद, केवल तैयार वर्णक सेट के भीतर ही छोड़े गए हैं।