2012-01-28 22 views
6

मैं जोड़ी द्वारा प्रयोग बनाने में प्रवेश किया था कनेक्शन (बहुस्त्र्पीय के साथ) TCP और UDP के लिए क्या होता है:जब एक iOS आवेदन पृष्ठभूमि

सेटअप 1: मैं एक टीसीपी भेजने वाले एप्लिकेशन और एक TCP रिसीवर एप्लिकेशन बनाया।

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

सेटअप 2: मैंने एक यूडीपी प्रेषक ऐप और एक यूडीपी रिसीवर ऐप बनाया है।

उपरोक्त के समान, मैंने आईओएस डिवाइस पर यूडीपी प्रेषक ऐप और अन्य आईओएस डिवाइस पर यूडीपी रिसीवर ऐप शुरू किया। यूडीपी रिसीवर ऐप पर मैंने मल्टीकास्ट समूह की सदस्यता ली, आदि। मैंने सत्यापित किया कि यूडीपी रिसीवर ऐप यूडीपी प्रेषक ऐप द्वारा भेजे गए मल्टीकास्ट समूह से डेटा प्राप्त कर रहा है। मैं फिर यूडीपी रिसीवर ऐप पृष्ठभूमि में डाल दिया। 2 मिनट के बाद, मुझे डेटा का एक और टुकड़ा भेजने के लिए यूडीपी प्रेषक ऐप मिलता है। मैंने फिर यूडीपी प्रेषक ऐप को पूरी तरह से छोड़ दिया और आईओएस डिवाइस बंद कर दिया। मैं फिर 2 मिनट या उससे अधिक के लिए इंतजार करता हूं, और फिर पृष्ठभूमि से यूडीपी रिसीवर ऐप लाता हूं। यूडीपी रिसीवर ऐप को उस डेटा को प्राप्त हुआ जो यूडीपी प्रेषक ऐप द्वारा समाप्त होने से पहले भेजा गया था।

सेटअप 1 में, मेरी व्याख्या इसलिए है क्योंकि टीसीपी एक कनेक्शन उन्मुख है।

सेटअप 2 में, मुझे लगता है कि यूडीपी कनेक्शन रहित है। कोई स्पष्टीकरण क्यों सेटअप 2 ने मेरे अनुभव में रास्ता तय किया? (अभी भी पृष्ठभूमि मोड में भी डेटा प्राप्त करना)

उत्तर

10

यह तब होता है जब आप पृष्ठभूमि में ऐप डालते हैं और फिर इसे निलंबित करने दें, यह कर्नेल द्वारा निर्धारित होने से रोकता है। यह किसी भी कनेक्शन को तुरंत तोड़ नहीं देता है या किसी भी सॉकेट को फाड़ नहीं देता है (जब तक आप इसे मजबूर नहीं करते हैं।)

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

टीसीपी मामले में, काफी वही चीज़ हैपेंस।

लेकिन (बड़ा लेकिन): ओएस हमेशा निलंबित ऐप्स के लिए सॉकेट को फाड़ने का विकल्प होता है, अगर वह मेमोरी प्रेशर आदि के आधार पर चाहता है, तो यह जरूरी नहीं है कि यह इसे मुफ्त में कर सके, यह हो सकता है ।

मुझे यकीन नहीं है कि आप टीसीपी कनेक्शन को जल्द से जल्द क्यों देख रहे हैं। ऐसा हो सकता है कि टीसीपी कनेक्शन को सर्वर करने के लिए कर्नेल हेरिस्टिक्स यूडीपी सॉकेट के मुकाबले अधिक आक्रामक है क्योंकि टीसीपी कनेक्शनों को यूडीपी सॉकेट की तुलना में अधिक राज्य और अधिक निरंतर प्रसंस्करण की आवश्यकता होती है।

Technical Note TN2277 Networking and Multitasking देखें।

+1

वैसे, मैं मान रहा हूं कि जब आप 'पृष्ठभूमि' कहते हैं तो 'निलंबित' होता है क्योंकि आपने उल्लेख नहीं किया है कि पृष्ठभूमि-सक्षम ऐप (वीओआईपी, संगीत इत्यादि) चलाने की कोशिश कर रहे थे, जब तक आप कुछ नहीं करते विशेष, पृष्ठभूमि आपके ऐप के लिए एक क्षणिक स्थिति है जिसे पृष्ठभूमि में प्रवेश करने के तुरंत बाद निलंबित कर दिया जाता है। ऐप्पल आईओएस ऐप लाइफसाइक्ल डॉक्स देखें। – smparkes

+0

उत्कृष्ट स्पष्टीकरण! मेरी सोच आपकी व्याख्या के साथ इनलाइन थी और वह (+1 अप वोट) तकनीकी लेख बहुत पुष्टि करता है। हाँ, मेरा मतलब पृष्ठभूमि को निलंबित कर दिया गया था। एफवाईआई: कारण मेरा टीसीपी प्रेषक जल्दी से दुर्घटनाग्रस्त हो गया क्योंकि यह लगातार रिसीवर को डेटा स्ट्रीम भेज रहा था। – user523234

+0

यह समझ में आएगा: यदि आप डेटा भेजते हैं कि गंतव्य प्राप्त नहीं होता है और मुख्य थ्रेड पर अवरुद्ध कॉल के साथ ऐसा करता है, तो आईओएस आपके ऐप को जवाब देने और इसे मारने के रूप में नहीं देखेगा। टीसीपी कनेक्शन अभी भी ठीक हो सकता है; बफर प्रबंधित करने के लिए इसका प्रवाह नियंत्रण होता है, लेकिन आपको मुख्य धागे को बहुत लंबे समय तक अवरुद्ध करने की अनुमति नहीं है। – smparkes

0

मेरी राय ओएस की वजह से है, यदि आप एंड्रॉइड ओएस पर कोशिश करते हैं तो ऐसा नहीं होना चाहिए क्योंकि आईओएस पर पृष्ठभूमि पर क्या काम कर सकता है और क्या नहीं कर सकता है।

जो आपने कहा वह मुझे लगता है क्योंकि टीसीपी को जानकारी भेजने के लिए अधिक संसाधनों की आवश्यकता है। टीसीपी डेटा धाराओं का उपयोग करता है और यूडीपी डेटा ब्लॉक का उपयोग करता है। समस्या यह है कि टीसीपी डेटा के बड़े पैकेज बनाता है जबकि यूडीपी 8 केबी डेटा ब्लॉक का उपयोग करता है।

संबंधित मुद्दे