मैं लिनक्स सिस्टम पर काम कर रहा हूं (2.6.20 कर्नेल के साथ उबंटू 7.04 सर्वर)।यूडीपी सॉकेट पर चयन सॉकेट बंद होने पर समाप्त नहीं होता है - मैं क्या गलत कर रहा हूं?
मैं एक कार्यक्रम एक धागा (thread1) है कि पठनीय बनने के लिए UDP सॉकेट के लिए एक चयन पर इंतजार कर मिल गया है। मैं केवल एक कॉलआउट चाहता हूं क्योंकि मैं केवल एक कॉलआउट चाहता हूं क्योंकि मैं केवल एक को पढ़ने के बजाय चयन (मेरे सॉकेट के साथ एकल readfd और एकल वगैरह के रूप में) का उपयोग कर रहा हूं।
किसी अन्य धागे से, मैं सॉकेट बंद करता हूं और सॉकेट बंद करता हूं। यदि मैं ऐसा करता हूं तो थ्रेड 1 को रिकॉर्फ़ में अवरुद्ध कर दिया जाता है, तो रिक्रॉर्फ़ तुरंत समाप्त हो जाएगा। यदि मैं ऐसा करता हूं, तो थ्रेड 1 को टाइमआउट के साथ चयन में अवरुद्ध कर दिया जाता है, तो चयन तुरंत समाप्त नहीं होगा, लेकिन आखिरकार समय-समय पर ठीक हो जाएगा।
किसी को भी मुझे बता सकते हैं क्यों यह है कि चयन जैसे ही सॉकेट बंद कर दिया है से बाहर निकलने नहीं करता है? क्या यह अपवाद नहीं है? मैं देख सकता हूं कि यह कहां पठनीय नहीं है (जाहिर है), लेकिन यह बंद है, जो प्रतीत होता है।
struct timeval to;
to.tv_sec = timeout_ms/1000;// just the seconds portion
to.tv_usec = (timeout_ms%1000)*1000;// just the milliseconds
// converted to microseconds
// watch our one fd for readability or
// exceptions.
fd_set readfds, exceptfds;
FD_ZERO(&readfds);
FD_SET(m_sockfd, &readfds);
FD_ZERO(&exceptfds);
FD_SET(m_sockfd, &exceptfds);
int nsel = select(m_sockfd+1, &readfds, NULL, &exceptfds, &to);
अद्यतन:
m_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
struct sockaddr_in si_me;
memset((char *) &si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(m_sockfd, (struct sockaddr *)(&si_me), sizeof(si_me)) < 0)
{
// deal with error
}
यहाँ चुनिंदा बयान है कि thread1 निष्पादित करता है:
यहाँ (सभी त्रुटि इसे आसान बनाने के लिए हटा दिया हैंडलिंग) सॉकेट के उद्घाटन के अवसर है जाहिर है (जैसा कि नीचे वर्णित), सॉकेट बंद करना एक असाधारण स्थिति नहीं है (चयन के दृष्टिकोण से)। मुझे लगता है कि मुझे क्या जानने की ज़रूरत है: क्यों? और, क्या यह जानबूझकर है?
मैं वास्तव में इस चयन व्यवहार के पीछे की सोच को समझने के लिए, क्योंकि यह मेरी उम्मीदों के लिए काउंटर लगता है चाहता हूँ। इस प्रकार, मुझे स्पष्ट रूप से मेरी सोच को समायोजित करने की आवश्यकता है कि टीसीपी स्टैक कैसे काम करता है। कृपया मुझे यह समझाओ।
यह एक अच्छा समाधान होगा। सॉकेट और पाइप दोनों पर चयन का इंतजार करें, और दूसरा थ्रेड पाइप को लिखने के लिए चयन करने के लिए लिख देगा। –
यह काम करेगा और संभवतः मैं समाप्त हो जाऊंगा। मैं बस किसी भी अतिरिक्त चलती भागों से बचना चाहता था। धन्यवाद! –