आप केवल लिखने() funcation को कॉल करने के साथ अनप्लग ईथरनेट केबल का पता नहीं लगा सकते हैं। यह आपकी चेतना के बिना टीसीपी स्टैक द्वारा किए गए टीसीपी रीट्रांसमिशन की वजह से है। यहां समाधान हैं।
भले ही आप पहले से ही अपने एप्लिकेशन सॉकेट में रखरखाव विकल्प सेट करते हैं, फिर भी आप अपने सॉकेट पर सॉकेट लिखते समय सॉकेट की मृत कनेक्शन स्थिति का पता नहीं लगा सकते हैं। यह कर्नेल टीसीपी स्टैक द्वारा टीसीपी रीट्रान्समिशन की वजह से है। tcp_retries1 और tcp_retries2 tcp retransmission टाइमआउट को कॉन्फ़िगर करने के लिए कर्नेल पैरामीटर हैं। रीट्रान्समिशन टाइमआउट के सटीक समय की भविष्यवाणी करना मुश्किल है क्योंकि इसकी गणना आरटीटी तंत्र द्वारा की जाती है। आप आरएफसी 7 9 3 में इस गणना को देख सकते हैं। (3.7। डाटा कम्युनिकेशन)
https://www.rfc-editor.org/rfc/rfc793.txt
प्रत्येक प्लेटफार्मों टीसीपी पुनर्संचरण के लिए कर्नेल विन्यास है।
Linux : tcp_retries1, tcp_retries2 : (exist in /proc/sys/net/ipv4)
http://linux.die.net/man/7/tcp
HPUX : tcp_ip_notify_interval, tcp_ip_abort_interval
http://www.hpuxtips.es/?q=node/53
AIX : rto_low, rto_high, rto_length, rto_limit
http://www-903.ibm.com/kr/event/download/200804_324_swma/socket.pdf
आप tcp_retries2 (डिफ़ॉल्ट 15) यदि आप जल्दी मृत कनेक्शन का पता लगाने के लिए चाहते हैं के लिए कम मूल्य निर्धारित करना चाहिए, लेकिन यह है मैं पहले से ही सटीक समय नहीं है कहा हुआ। इसके अतिरिक्त, वर्तमान में आप केवल उन सॉकेट को एकल सॉकेट के लिए सेट नहीं कर सकते हैं। वे वैश्विक कर्नेल पैरामीटर हैं। एकल सॉकेट (http://patchwork.ozlabs.org/patch/55236/) के लिए टीसीपी रीट्रांसमिशन सॉकेट विकल्प लागू करने के लिए कुछ परीक्षण किया गया था, लेकिन मुझे नहीं लगता कि इसे कर्नेल मेनलाइन में लागू किया गया था। मुझे सिस्टम हेडर फ़ाइलों में उन विकल्पों की परिभाषा नहीं मिल रही है।
संदर्भ के लिए, आप नीचे दिए गए 'netstat --timers' के माध्यम से अपने रखरखाव सॉकेट विकल्प की निगरानी कर सकते हैं। https://stackoverflow.com/questions/34914278
netstat -c --timer | grep "192.0.0.1:43245 192.0.68.1:49742"
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (1.92/0/0)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (0.71/0/0)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (9.46/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (8.30/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (7.14/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (5.98/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (4.82/0/1)
इसके अतिरिक्त, जब keepalive टाइमआउट ocurrs, आप विभिन्न वापसी घटनाओं प्लेटफार्मों आप उपयोग पर निर्भर करता है, को पूरा कर सकते हैं ताकि आप वापसी घटनाओं से केवल मृत कनेक्शन स्थिति तय नहीं करना चाहिए। उदाहरण के लिए, एचपी पोलरर इवेंट देता है और एईक्स केवल पॉलीन इवेंट देता है जब रखरखाव टाइमआउट होता है। आप उस समय recv() कॉल में ETIMEDOUT त्रुटि को पूरा करेंगे।
हाल के कर्नेल संस्करण (2.6.37 के बाद से) में, आप TCP_USER_TIMEOUT विकल्प का उपयोग कर सकते हैं। इस विकल्प का उपयोग एकल सॉकेट के लिए किया जा सकता है।
अंत में, आप एमएसजी_PEEK ध्वज के साथ पढ़ने के फ़ंक्शन का उपयोग कर सकते हैं, जो आपको यह जांचने दे सकता है कि सॉकेट ठीक है। (MSG_PEEK सिर्फ कर्नेल स्टैक बफर पर डेटा पहुंचने पर चिपक जाता है और कभी भी उपयोगकर्ता बफर में डेटा कॉपी नहीं करता है।) तो आप किसी भी दुष्प्रभाव के बिना सॉकेट की जांच के लिए इस ध्वज का उपयोग कर सकते हैं ठीक है।
प्रश्न ईथरनेट केबल को अनप्लग करने के बारे में है। – EJP