दिलचस्प पोस्ट
हास्केल में वस्तु उन्मुख प्रोग्रामिंग हर अनुरोध पर नीला 400 बुरा अनुरोध सी # का उपयोग कर क्रोम ब्राउज़र शीर्षक प्राप्त करें प्रोग्राम के लिए आईफोन के लिए लोकेल मुद्रा खोजें सदस्यता प्रदाता के साथ ASP.NET MVC 4 वेब एपीआई प्रमाणीकरण सीएसएस बाल बनाम निर्वाचक चयनकर्ता Numpy arrays और matrices के बीच अंतर क्या हैं? मुझे किसका उपयोग करना चाहिए? Node.js Mongoose.js स्ट्रिंग ObjectId फ़ंक्शन के लिए क्षैतिज प्रगति बार से ऊर्ध्वाधर पैडिंग निकालें पायथन में मल्टीप्रोसेसिंग और थ्रेडिंग मिश्रण की स्थिति क्या रंग मिश्रण के लिए एक एल्गोरिथ्म है जो असली रंगों को मिलाकर काम करता है? जूमला 3.2.1 पासवर्ड एन्क्रिप्शन पायथन 3: ईओएफ जब एक लाइन को पढ़ता है (सफ़ल पाठ 2 गुस्से में है) सी ++: बिल्टइन (अर्थात, सी-जैसे) के लिए पास-बाय- रॉक, पेपर, कैंची, छिपकली, जावास्क्रिप्ट में स्पॉक

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

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

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

Solutions Collecting From Web of "टीसीपी सॉकेट वियोग का पता लगाने के लिए (सी बर्कले सॉकेट के साथ)"

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

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 विकल्प अच्छी तरह से काम करेगा यह विकल्प एकल सॉकेट के लिए इस्तेमाल किया जा सकता है