2009-12-30 17 views
6

का उपयोग कर HTTP बंद का पता लगाने मेरे mochiweb एप्लिकेशन में, मैं एक लंबे समय तक आयोजित HTTP अनुरोध का उपयोग कर रहा हूं। मैं पता लगाने के लिए जब उपयोगकर्ता के सिलसिले मर गया था, और मैं पता लगा कि कैसे करना है करके:इनेट

Socket = Req:get(socket), 
inet:setopts(Socket, [{active, once}]), 
receive 
    {tcp_closed, Socket} -> 
      % handle clean up 
    Data -> 
      % do something 
end. 

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

क्या मुझे कुछ याद आ रहा है, या क्या यह हासिल करने का कोई और तरीका है?

उत्तर

2

TCP keepalive protocol है और इसे {keepalive, Boolean} विकल्प के तहत inet:setopts/2 के साथ सक्षम किया जा सकता है।

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

HTTP प्रोटोकॉल में status code Request Timeout है जो आप क्लाइंट को भेज सकते हैं यदि यह मृत लगता है।

after क्लॉज प्राप्त करने के लिए क्लॉज प्राप्त करने के लिए after क्लॉज प्राप्त करें, या टाइमर मॉड्यूल का उपयोग करें या erlang:start_timer/3 का उपयोग करें। उनके पास सभी अलग-अलग प्रदर्शन विशेषताओं और संसाधन लागत हैं।

+0

मैंने बाद के खंड का उपयोग करने पर विचार किया, लेकिन इस मामले में, मेरी प्रक्रिया एक हाइबरनेटिंग प्रक्रिया हो सकती है। क्या बाद के खंड अभी भी एक हाइबरनेटिंग प्रक्रिया के लिए काम करेंगे? – jeffreyveon

+0

नहीं, यह नहीं होगा। जब कोई संदेश भेजा जाता है तो एक हाइबरनेटिंग प्रक्रिया उठ जाती है। कोई हाइबरनेशन टाइमआउट नहीं है, इसलिए जागने के लिए आपको देरी संदेश दिया गया है। – Christian

1

कोई डिफ़ॉल्ट "जीवित रखें" नहीं है (लेकिन enabled if supported हो सकता है) टीसीपी पर प्रोटोकॉल: यदि कोई डेटा आदान-प्रदान नहीं होने पर कनेक्शन गलती हो, तो यह "चुप विफलता" में अनुवाद करता है। आपको इस प्रकार की विफलता के लिए खुद को जिम्मेदार होना होगा उदा। कनेक्शन जांच के कुछ रूप लागू करें।

यह HTTP को कैसे प्रभावित करता है? HTTP एक स्टेटलेस प्रोटोकॉल है - इसका मतलब है कि हर अनुरोध एक दूसरे से स्वतंत्र है। HTTP की "जिंदा रहें" कार्यक्षमता बदलती नहीं है यानी "चुप विफलता" अभी भी हो सकती है।

केवल तभी जब डेटा का आदान-प्रदान किया जाता है इस स्थिति का पता लगाया जा सकता है (या जब टीसीपी रखें लाइव सक्षम है)।

0

मैं सुझाव देता हूं कि एप्लिकेशन स्तर को HTTP चंक-एन्कोडिंग पर जीवंत संदेश रखें। अपने क्लाइंट/सर्वर को जीवित संदेशों को समझने के लिए पर्याप्त समझदार है और यदि वे समय पर आते हैं या फिर कनेक्शन को फिर से स्थापित करते हैं तो उन्हें अनदेखा करते हैं।