दिलचस्प पोस्ट
Async / await बनाम बैकवर्डवर्क वर्कर Socket.io + Node.js क्रॉस-ऑरिजन अनुरोध अवरुद्ध HTML5 में पॉलीफिल का क्या अर्थ है? एक। NET समाधान में अप्रयुक्त संसाधन खोजें सी # में फ़ॉर्म को कोड करते समय डिजाइनर को नहीं देख सकता पृष्ठ पर घड़ियों की कुल संख्या की गणना कैसे करें? स्प्रिंग सुरक्षा अभिव्यक्ति भाषा एनोटेशन में उपयोग के लिए कस्टम विधियाँ कैसे बनाएं कब और क्यों प्रतिनिधियों का उपयोग करें? कैसे सी # खिड़कियों के आवेदन में रूपों के बीच मूल्यों को पारित करने के लिए? Jquery ट्रिगर फ़ाइल इनपुट एक स्ट्रिंग में stdout / stderr अनुप्रेषित करें सी # में क्यों मैं सार स्थिर तरीकों नहीं कर सकता? “ “ सबसेट `से बेहतर क्यों है? पुनर्निर्देशित करें system.out.println वास्तव में, डबल-स्ट्रैसिंग चाल कार्य कैसे करता है?

टीसीपी सॉकेट वियोग का पता लगाने के लिए (सी बर्कले सॉकेट के साथ)

मैं एसी बर्कले सॉकेट से संदेश को पढ़ने के लिए एक पाश का उपयोग कर रहा हूं, लेकिन मैं सॉकेट का डिस्कनेक्ट कर लिया है, इसलिए पता लगाने में असमर्थ हूं इसलिए मैं एक नया कनेक्शन स्वीकार करता हूं। कृपया सहायता कीजिए

while(true) { bzero(buffer,256); n = read(newsockfd,buffer,255); printf("%s\n",buffer); } 

वेब के समाधान से एकत्रित समाधान "टीसीपी सॉकेट वियोग का पता लगाने के लिए (सी बर्कले सॉकेट के साथ)"

एकमात्र तरीका है जो आप जान सकते हैं कि एक सॉकेट जुड़ा हुआ है, उसे लिखकर।

read()/recv() पर एक त्रुटि हो रही है कि कनेक्शन टूट गया है, लेकिन पढ़ने में त्रुटि नहीं होने का यह मतलब नहीं है कि कनेक्शन ऊपर है

आपको इसे पढ़ने में रुचि हो सकती है: http://lkml.indiana.edu/hypermail/linux/kernel/0106.1/1154.html

इसके अतिरिक्त, टीसीपी रखें जिंदा का उपयोग करने से निष्क्रिय और टूटे हुए कनेक्शनों के बीच अंतर करने में मदद मिल सकती है (नियमित अंतराल पर कुछ भी भेजकर, भले ही कोई भी आवेदन एप्लिकेशन द्वारा भेजा जा सके)।

(संपादित करें: डैमन द्वारा धन्यवाद की गई गलत वाक्य को हटाया गया, धन्यवाद।)

आपकी समस्या यह है कि आप पूरी तरह से read() द्वारा दिए गए परिणाम की अनदेखी कर रहे हैं। read() के बाद आपका कोड कम से कम इस तरह दिखना चाहिए:

 if (n == 0) // peer disconnected break; else if (n == -1) // error { perror("read"); break; } else // received 'n' bytes { printf("%.*s", n, buffer); } 

और एक नया कनेक्शन स्वीकार करना एक अलग धागे में किया जाना चाहिए, इस कनेक्शन पर स्ट्रीम के अंत पर निर्भर नहीं होना चाहिए।

bzero() कॉल बेकार है, केवल पूर्व त्रुटियों के लिए एक वैकल्पिक हल

इसका कारण यह है कि आपने इनके पास टाइमलाइन का उपयोग नहीं किया था पक्ष प्राप्त करने में, पावर सॉकेट विकल्प, मृत कनेक्शन का पता लगाने के लिए सबसे अच्छा समाधान है।

लेकिन, आपके आवेदन के मामले में गर्तिका में लिखना जारी रहेगा, और कुछ सोचने के लिए कुछ और है। भले ही आपने अपने सॉफ़्टवेयर के लिए पहले से ही एक वैकल्पिक विकल्प सेट किया हो, आप सॉकेट के मृत कनेक्शन स्थिति में समय का पता नहीं लगा सकते हैं, आपके ऐप के मामले में गर्तिका पर लिखना जारी रहता है। यही कारण है कि कर्नेल टीसीपी स्टैक द्वारा टीसीपी रिट्रांस्डमिशन की वजह से। tcp_retries1 और tcp_retries2 टीसीपी रिट्रांसशन टाइमआउट को कॉन्फ़िगर करने के लिए कर्नेल पैरामीटर हैं। पुनःसंशोधन समय समाप्त होने के सटीक समय की भविष्यवाणी करना कठिन है क्योंकि इसकी गणना आरटीटी तंत्र द्वारा की गई है आप आरएफसी 793 में इस गणना को देख सकते हैं। (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

यदि आपको मृत कनेक्शन का पता लगाना चाहते हैं, तो आपको टीसीपी_ट्रीज़ 2 (डिफ़ॉल्ट 15) के लिए कम मान सेट करना चाहिए, लेकिन यह पहले से ही कहा गया सटीक समय नहीं है। इसके अतिरिक्त, वर्तमान में आप उन मानों को एकल सॉकेट के लिए सेट नहीं कर सकते हैं वे वैश्विक कर्नेल पैरामीटर हैं। एकल सॉकेट ( http://patchwork.ozlabs.org/patch/55236/ ) के लिए टीसीपी रिट्रांसशन सॉकेट विकल्प लागू करने के लिए कुछ परीक्षण थे, लेकिन मुझे नहीं लगता कि इसे कर्नेल मेनलाइन में लागू किया गया था। मुझे सिस्टम हेडर फाइल में उन विकल्पों की परिभाषा नहीं मिल रही है

संदर्भ के लिए, आप अपने keepalive सॉकेट विकल्प को '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) 

इसके अलावा, जब पाल टाइमआउट ऑकुरर्स होते हैं, तो आप प्लेटफार्मों के उपयोग के आधार पर अलग-अलग रिटर्न इवेंट्स को पूरा कर सकते हैं, इसलिए आपको वापसी संबंधी घटनाओं से केवल डेड कनेक्शन स्थिति तय नहीं करनी चाहिए। उदाहरण के लिए, हिमाचल प्रदेश रिटर्न POLLERR घटना और AIX रिटर्न सिर्फ POLLIN घटना जब keepalive समय समाप्त होता है। उस समय आप आरईसीवी () कॉल में ईटीआईआईडीयूयूटी त्रुटि को पूरा करेंगे।

हाल के कर्नेल संस्करण में (2.6.37 के बाद से), आप उपयोग कर सकते हैं TCP_USER_TIMEOUT विकल्प अच्छी तरह से काम करेगा यह विकल्प एकल सॉकेट के लिए इस्तेमाल किया जा सकता है