दिलचस्प पोस्ट
जावास्क्रिप्ट – वर्तमान उपयोगकर्ता का नाम कैसे प्राप्त करें क्या मैं उप फ़ोल्डर्स सहित किसी फ़ोल्डर में सभी आउटलुक ईमेलों के माध्यम से दोहरा सकता हूं? नोडजेएस एक्सप्रेस में मार्ग मैपिंग निकालें कितने धागे को पूरा करने के लिए इंतजार करना है? वहाँ एक regex स्वाद है कि मुझे * और + ऑपरेटरों द्वारा मिलान दोहराव की संख्या की गिनती करने की अनुमति देता है? स्ट्रिंग से एक्सटेंशन कैसे निकालें (केवल वास्तविक एक्सटेंशन!) HTML5 केनवास से बाइनरी (बेस 64) डेटा प्राप्त करना (readAsBinaryString) " बच्चा पीड XXXX एक्सेग्ज सिग्नल सेगमेंटेशन फॉल्ट (11)" अपाचे में त्रुटि। लॉग जावा में दो तिथियों के बीच सप्ताह के दिनों की संख्या की गणना करें कक्षा और उदाहरण तरीकों के बीच का अंतर जब उपयोगकर्ता स्क्रीन को पिन कर देता है तो एक UIImage ऑब्जेक्ट ज़ूम इन / आउट कैसे करें? उपयोग करने के लिए कब। पहली और उपयोग करने के लिए। LINQ के साथ पहलेऑपर डीफॉल्ट? सीएसएस स्टाइलशीट्स में क्रॉस साइट स्क्रिप्टिंग मैं कैसे कॉल कर सकता हूँ :: CreateProcess में सी + + एक विंडोज निष्पादन योग्य शुरू करने के लिए? क्लिक पर ट्विटर बूटस्ट्रैप एप पतन छुपाएं

एकाधिक कनेक्शन बनाने में सी में सॉकेट टाइमआउट कैसे सेट करें?

मैं एक साधारण प्रोग्राम लिख रहा हूं जो स्टेटस चेक के लिए अलग-अलग सर्वरों के साथ कई कनेक्शन बनाता है। इन सभी कनेक्शन मांग पर बने होते हैं; अप करने के लिए 10 कनेक्शन एक साथ बनाया जा सकता है मुझे एक धागा-प्रति-सॉकेट के विचार पसंद नहीं है, इसलिए मैंने इन सभी क्लाइंट सॉकेट्स गैर-अवरोधन किए, और उन्हें एक चयन () पूल में फेंक दिया

यह बहुत अच्छा काम करता है, जब तक कि मेरे मुवक्किल ने शिकायत नहीं की कि जब लक्ष्य सर्वर ने जवाब देना बंद कर दिया तो त्रुटि रिपोर्ट प्राप्त करने से पहले इंतजार करने का समय बहुत लंबा है

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

क्या सिस्टम-डिफ़ॉल्ट समयबाह्य अवधि बदलने के लिए वैसे भी है?

वेब के समाधान से एकत्रित समाधान "एकाधिक कनेक्शन बनाने में सी में सॉकेट टाइमआउट कैसे सेट करें?"

आप SO_RCVTIMEO और SO_SNDTIMEO सॉकेट विकल्पों का उपयोग किसी भी सॉकेट परिचालन के लिए समय समाप्ति सेट करने के लिए कर सकते हैं, जैसे:

struct timeval timeout; timeout.tv_sec = 10; timeout.tv_usec = 0; if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) error("setsockopt failed\n"); if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) error("setsockopt failed\n"); 

संपादित करें: setsockopt मैन पेज से :

SO_SNDTIMEO आउटपुट कार्यों के लिए एक टाइमआउट मान सेट करने का एक विकल्प है यह सेकंड की संख्या के साथ एक स्ट्रक्चर टाइमवेम पैरामीटर स्वीकार करता है और सीमा को करने के लिए उपयोग किए जाने वाले माइक्रोसॉन्ड्स आउटपुट कार्यों को पूरा करने के लिए प्रतीक्षा करता है। यदि कोई प्रेषण ऑपरेशन इस समय के लिए अवरुद्ध हो गया है, तो यह आंशिक गिनती के साथ या EWOULDBLOCK त्रुटि के साथ देता है अगर कोई डेटा नहीं भेजा गया था। वर्तमान कार्यान्वयन में, हर बार अतिरिक्त टाइमर को पुनरारंभ किया जाता है, जब यह संकेत करता है कि सीमा कम से कम पानी के निशान से उत्पादन के लिए उच्च-पानी के निशान तक के आउटपुट भागों पर लागू होती है।

SO_RCVTIMEO इनपुट ऑपरेशन के लिए एक टाइमआउट मान निर्धारित करने का एक विकल्प है। यह सेकंड की संख्या के साथ एक स्ट्रेट्स टाइमलाइन पैरामीटर स्वीकार करता है और सीमित करने के लिए उपयोग किए जाने वाले माइक्रोसॉन्ड्स इनपुट ऑपरेशन को पूरा करने के लिए प्रतीक्षा करता है। वर्तमान कार्यान्वयन में, हर बार प्रोटोटाल द्वारा अतिरिक्त डेटा प्राप्त होने पर, इस टाइमर को पुनरारंभ किया जाता है, और इस प्रकार सीमा एक निष्क्रियता टाइमर के प्रभाव में है। यदि कोई अतिरिक्त कार्रवाई प्राप्त करने के बिना इस प्राप्त किए गए समय के लिए एक प्रसंस्करण ऑपरेशन को अवरुद्ध कर दिया गया है, तो यह कोई छोटी संख्या या ईवूबलब्लॉक त्रुटि के साथ देता है अगर कोई डेटा प्राप्त नहीं हुआ है। संरचना समय-समय का पैरामीटर एक सकारात्मक समय अंतराल का प्रतिनिधित्व करना चाहिए; अन्यथा, setockopt () त्रुटि EDOM के साथ देता है।

मुझे यकीन नहीं है कि अगर मैं पूरी तरह से इस मुद्दे को समझता हूं, लेकिन मुझे लगता है कि यह मेरे पास से संबंधित है, तो क्यूटी का उपयोग टीसीपी सॉकेट संचार के साथ है, सभी गैर-अवरुद्ध, दोनों विंडोज़ और लिनक्स ..

एक तत्काल सूचना प्राप्त करना चाहते थे, जब एक पहले से जुड़ा ग्राहक विफल हो गया या पूरी तरह से गायब हो गया, और डिस्कनेक्ट संकेत तक उठने तक डिफ़ॉल्ट 900 + सेकंड तक प्रतीक्षा नहीं कर पाई। यह कार्य प्राप्त करने के लिए चालें, मिलीसेकंड में दी गई आवश्यक मूल्य के लिए SOL_TCP परत की TCP_USER_TIMEOUT सॉकेट विकल्प सेट करना था।

यह एक तुलनात्मक रूप से नया विकल्प है, pls देखें http://tools.ietf.org/html/rfc5482 , लेकिन जाहिरा तौर पर यह ठीक काम कर रहा है, WinXP, Win7 / x64 और कुबंटू 12.04 / x 64 के साथ इसकी कोशिश की, मेरी पसंद 10 एस निकला थोड़ी देर तक रहना, लेकिन इससे पहले कि मैंने कोशिश की है, उससे कुछ ज्यादा बेहतर 😉

केवल एक ही मुद्दा मैं आया था उचित खोजने के लिए, जैसा कि जाहिरा तौर पर यह मानक सॉकेट में शामिल नहीं है (अभी तक ..) शामिल है, तो अंत में मैं उन्हें खुद को निम्नानुसार परिभाषित किया गया था:

 #ifdef WIN32 #include <winsock2.h> #else #include <sys/socket.h> #endif #ifndef SOL_TCP #define SOL_TCP 6 // socket options TCP level #endif #ifndef TCP_USER_TIMEOUT #define TCP_USER_TIMEOUT 18 // how long for loss retry before timeout [ms] #endif 

इस सॉकेट विकल्प को सेट करना केवल तब ही काम करता है जब क्लाइंट पहले से कनेक्टेड है, कोड की लाइनें जैसे दिखती हैं:

 int timeout = 10000; // user timeout in milliseconds [ms] setsockopt (fd, SOL_TCP, TCP_USER_TIMEOUT, (char*) &timeout, sizeof (timeout)); 

और एक प्रारंभिक कनेक्ट की विफलता को कनेक्ट () फोन करते समय शुरू की गई टाइमर द्वारा पकड़ा जाता है, क्योंकि इसके लिए क्यूटी का कोई संकेत नहीं होगा, कनेक्ट सिग्नल को नहीं उठाया जाएगा, क्योंकि कोई कनेक्शन नहीं होगा, और डिस्कनेक्ट सिग्नल होगा भी उठाया नहीं जा सकता, क्योंकि अभी तक कोई संबंध नहीं हुआ है ..

क्या आप अपने खुद के टाइमआउट सिस्टम को लागू नहीं कर सकते हैं?

एक सॉर्टेड सूची रखें, या बेहतर अभी तक प्राथमिकता ढेर के रूप में हीथ सुझाता है, टाइमआउट इवेंट्स का आपके चयन या पोल कॉल में टाइमआउट सूची के शीर्ष पर से समय का मूल्य का उपयोग करें। जब वह समय समाप्त हो जाता है, तो उस समय से संबंधित कार्यवाही करें

यह क्रिया एक गर्तिका को बंद कर सकती है जो अभी तक कनेक्ट नहीं हुई है।

connect समयबाह्य को गैर अवरुद्ध सॉकेट ( connect पर जीएनयू लिबसी प्रलेखन ) के साथ नियंत्रित किया जाना चाहिए। आप तुरंत वापस लौटने के लिए connect जाते हैं और फिर कनेक्शन का पूरा होने के लिए समय समाप्ति के साथ प्रतीक्षा करने के लिए select का उपयोग select

इसे यहां समझाया गया है: ऑपरेशन अब कनेक्ट (फ़ंक्शन) त्रुटि पर प्रगति त्रुटि में है

 int wait_on_sock(int sock, long timeout, int r, int w) { struct timeval tv = {0,0}; fd_set fdset; fd_set *rfds, *wfds; int n, so_error; unsigned so_len; FD_ZERO (&fdset); FD_SET (sock, &fdset); tv.tv_sec = timeout; tv.tv_usec = 0; TRACES ("wait in progress tv={%ld,%ld} ...\n", tv.tv_sec, tv.tv_usec); if (r) rfds = &fdset; else rfds = NULL; if (w) wfds = &fdset; else wfds = NULL; TEMP_FAILURE_RETRY (n = select (sock+1, rfds, wfds, NULL, &tv)); switch (n) { case 0: ERROR ("wait timed out\n"); return -errno; case -1: ERROR_SYS ("error during wait\n"); return -errno; default: // select tell us that sock is ready, test it so_len = sizeof(so_error); so_error = 0; getsockopt (sock, SOL_SOCKET, SO_ERROR, &so_error, &so_len); if (so_error == 0) return 0; errno = so_error; ERROR_SYS ("wait failed\n"); return -errno; } } 

बेशक पहला जवाब सबसे अच्छा है क्या मैं कुछ जोड़ सकता हूँ?

2 सेटोकॉप्ट के बाद आप नियंत्रित कर सकते हैं कि क्लाइंट ने टाइमआउट परीक्षा उत्तीर्ण की, या इसके साथ असफल:

के बाद

 n = readline(sockd, recvline, MAXLINE); 

आपको डालेंगे

 if (n <= 0){ if(write(sockd,"ERROR. Timeout di 5sec scaduto, sii piu' veloce\n",MAXLINE)<0) err_sys("errore nella write"); close(sockd); sockd = 0; break; }