एक गैर अवरुद्ध, कनेक्ट() सॉकेट संभालने पहले से ही किया गया है गैर अवरुद्ध करने के लिए:
int res = connect(fd, ...);
if (res < 0 && errno != EINPROGRESS) {
// error, fail somehow, close socket
return;
}
if (res == 0) {
// connection has succeeded immediately
} else {
// connection attempt is in progress
}
दूसरे मामले में, जहां कनेक्ट (के लिए) और EINPROGRESS के साथ विफल (केवल इस मामले में), आपको सॉकेट को लिखने योग्य होने की प्रतीक्षा करनी है, उदाहरण के लिए एपोल के लिए निर्दिष्ट करें कि आप इस सॉकेट पर EPOLLOUT की प्रतीक्षा कर रहे हैं।() कभी
int result;
socklen_t result_len = sizeof(result);
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &result, &result_len) < 0) {
// error, fail somehow, close socket
return;
}
if (result != 0) {
// connection failed; error code is in 'result'
return;
}
// socket is ready for read()/write()
मेरे अनुभव में, लिनक्स पर, कनेक्ट: एक बार जब आप सूचित कर दिया है कि यह लिखने योग्य है, कनेक्शन का प्रयास का परिणाम जाँच (epoll साथ, भी प्राप्त करने के लिए एक EPOLLERR या EPOLLHUP घटना की उम्मीद) तुरंत सफल होता है और आपको हमेशा उत्तरदायित्व की प्रतीक्षा करनी पड़ती है। हालांकि, उदाहरण के लिए, फ्रीबीएसडी पर, मैंने गैर-अवरुद्ध कनेक्ट() को लोकहोस्ट को तुरंत सफल होने के लिए देखा है।
स्रोत
2012-04-17 16:07:10
यह आपको मदद कर सकता है: http://stackoverflow.com/questions/2875002/non-blocking-tcp-connect-with-epoll –
लिंक किए गए डीजेबी पृष्ठ पर सुझावों के संभावित विकल्प के रूप में, मैं सुझाव देना चाहता हूं कि 'डुप्लिकेट' 'और 'डिस्क्रिप्टर' बंद करें (और डुप्लिकेट का उपयोग करें)।परीक्षण नहीं किया गया, लेकिन यह मेरी समझ में काम करना चाहिए। दस्तावेज़ बताते हैं कि यह एक गंभीर प्रोग्रामिंग त्रुटि है जो 'बंद' के वापसी मूल्य की जांच न करें, क्योंकि यह पिछली त्रुटि लौटा सकती है। यही वही है जो आप चाहते हैं (यदि 'बंद' त्रुटि देता है, तो 'कनेक्ट' विफल हुआ)। यद्यपि यदि आप 'एपोल' का उपयोग करते हैं तो आपको एक ओएस रखने की गारंटी है जहां' होकॉकॉप्ट (SO_ERROR) 'काम करेगा ... – Damon
यदि व्यवहार्य है, तो सबसे सरल विकल्प सेट करने से पहले कनेक्ट() रिटर्न के बाद तक प्रतीक्षा करना है NON_BLOCK। – delicateLatticeworkFever