2012-11-13 8 views
17

क्या NSRLConnection के साथ बनाए गए एक सतत कनेक्शन को नष्ट करना संभव है? मुझे लगातार कनेक्शन को नष्ट करने और एक और एसएसएल हैंडशेक करने में सक्षम होना चाहिए।NSURLConnection का उपयोग कर एक सतत कनेक्शन को कैसे रद्द करें?

जैसा कि अब है, [conn cancel] को कॉल करना एक लगातार कनेक्शन छोड़ देता है जिसका उपयोग उस मेजबान के अगले कनेक्शन अनुरोध के साथ किया जाता है, जिसे मैं नहीं करना चाहता।

+0

मुझे एक ही समस्या है। मैंने कई सुधारों की कोशिश की है लेकिन अब तक उनमें से कोई भी काम नहीं करता है। – EricS

उत्तर

16

जैसा कि यह पता चला है, मुझे विश्वास है कि सुरक्षित परिवहन टीएलएस सत्र कैश दोष है।

मैंने प्रश्न on the apple developer forums से पूछा, और एक ऐप्पल व्यक्ति से प्रतिक्रिया मिली। उन्होंने कहा कि मुझे इस Apple sample code readme की ओर इशारा किया है, जहां यह कहते हैं:

दोनों iOS और मैक ओएस एक्स पर टीएलएस ढेर के नीचे एक घटक सुरक्षित परिवहन के रूप में जाना जाता है। सुरक्षित परिवहन एक प्रति-प्रक्रिया टीएलएस सत्र कैश रखता है। जब आप टीएलएस के माध्यम से कनेक्ट होते हैं, तो कैश टीएलएस वार्ता के बारे में जानकारी संग्रहीत करता है ताकि बाद के कनेक्शन अधिक तेज़ी से जुड़ सकें। नीचे दिए गए लिंक पर ऑन-द-वायर तंत्र का वर्णन किया गया है।

http://en.wikipedia.org/wiki/Transport_Layer_Security#Resumed_TLS_handshake

यह कुछ रोचक gotchas प्रस्तुत करता है, विशेष रूप से जब तुम डिबगिंग रहे हैं।

  1. आप अक्षम पर टीएलएस सर्वर सत्यापन सेट करने के लिए डीबग टैब का उपयोग करें: उदाहरण के लिए, निम्न क्रम पर विचार करें।

  2. आप एक स्व-हस्ताक्षरित पहचान के साथ एक साइट से कनेक्ट हैं। कनेक्शन सफल हो गया है क्योंकि आपने टीएलएस सर्वर ट्रस्ट सत्यापन अक्षम कर दिया है। यह सुरक्षित परिवहन टीएलएस सत्र कैश में एक प्रविष्टि जोड़ता है।

  3. आप डीएलयूजी सर्वर प्रमाणीकरण को डिफ़ॉल्ट पर सेट करने के लिए डीबग टैब का उपयोग करते हैं।

  4. आप तुरंत उसी साइट से कनेक्ट होते हैं जैसा आपने चरण 2 में किया था। यह सर्वर ट्रस्ट सत्यापन नीति में परिवर्तन की वजह से विफल होना चाहिए, लेकिन यह सफल हो जाता है क्योंकि आपको कभी भी NSURLA प्रमाणीकरण MethodServerTrust चुनौती नहीं मिलती है। कवर के तहत, सिक्योर ट्रांसपोर्ट ने टीएलएस सत्र शुरू कर दिया है, जिसका मतलब है कि चुनौती कभी भी आपके स्तर पर बुलबुले नहीं होती है।

  5. दूसरी ओर, यदि आप चरण 3 और 4 के बीच 11 मिनट के लिए देरी करते हैं, तो चीजें अपेक्षित रूप से काम करती हैं (ठीक है, उम्मीद के रूप में विफल :-)। ऐसा इसलिए है क्योंकि सुरक्षित परिवहन के टीएलएस सत्र कैश में 10 मिनट का टाइमआउट होता है।

वास्तविक दुनिया में यह एक बड़ी समस्या नहीं है, लेकिन यह डिबगिंग के दौरान बहुत भ्रमित हो सकता है। सुरक्षित परिवहन टीएलएस सत्र कैश को साफ़ करने के लिए कोई प्रोग्रामेटिक तरीका नहीं है, लेकिन कैश प्रति-प्रक्रिया है, इसलिए आप अपने एप्लिकेशन को छोड़कर और फिर से लॉन्च करके डिबगिंग के दौरान इस समस्या से बच सकते हैं। याद रखें कि, आईओएस 4 से शुरू होने पर, होम बटन दबाकर आपके आवेदन को छोड़ना आवश्यक नहीं है। इसके बजाए, आपको हालिया एप्लिकेशन सूची से एप्लिकेशन को छोड़ना चाहिए।

तो, उस पर आधारित, उपयोगकर्ता को या तो अपने ऐप को मारना होगा और इसे पुनरारंभ करना होगा या कोई अन्य अनुरोध भेजने से पहले 10 मिनट से अधिक प्रतीक्षा करना होगा।

मैंने इस नई जानकारी के साथ एक और Google खोज की और this Apple technical Q&A article पाया जो इस समस्या से बिल्कुल मेल खाता है। नीचे के पास, यह एक पिछला 'जोड़ने' का उल्लेख है। एक टीएलएस सत्र कैश मिस को मजबूर करने के लिए अनुरोधों के लिए डोमेन नाम (और उम्मीद है कि आईपी पते) (यदि आप किसी भी तरह से सर्वर को संशोधित नहीं कर सकते हैं, जो मैं नहीं कर सकता), तो मैं इसे आजमाने की उम्मीद कर रहा हूं और उम्मीद करता हूं कि यह काम करेगा। परीक्षण के बाद मैं अपने निष्कर्ष पोस्ट करूंगा।

### संपादित ###

मैं एक जोड़ने का परीक्षण किया '।' आईपी ​​पते के अंत तक, और अनुरोध अभी भी सफलतापूर्वक पूरा हो गया था।

लेकिन मैं सामान्य रूप से समस्या के बारे में सोच रहा था, और वास्तव में कोई अन्य एसएसएल हैंडशेक को मजबूर करने का कोई कारण नहीं है। मेरे मामले में, इस समस्या का समाधान सर्वर से लौटाए गए अंतिम ज्ञात SecCertificateRef की एक प्रति रखना है। सर्वर पर एक और अनुरोध करते समय, यदि एक कैश किए गए टीएलएस सत्र का उपयोग किया जाता है (connection:didReceiveAuthenticationChallenge: नहीं कहा गया था), हम जानते हैं कि सहेजा गया SecCertificateRef अभी भी मान्य है। यदि connection:didReceiveAuthenticationChallenge: कहा जाता है, तो हम उस समय नया SecCertificateRef प्राप्त कर सकते हैं।

-3

सबसे पहले, आपको [self.conn रद्द करें] और दूसरा उपयोग करना चाहिए, जो कि यह कहता है। यह खुद को रद्द कर देता है। यदि आप इसके बाद NSRLConnection का उपयोग नहीं करना चाहते हैं, तो यह कुछ भी नहीं करेगा और यदि आप इसे फिर से उपयोग करेंगे, तो आप केवल एक अलग अनुरोध सेट कर सकते हैं, जो दिए गए सर्वर से कनेक्ट होगा।

उम्मीद है कि मदद करता है।

+0

मैंने अपने प्रश्न को स्पष्ट रूप से पर्याप्त समझाया नहीं है। NSURLConnection ऑब्जेक्ट (conn) को ठीक से रद्द कर दिया जाता है, लेकिन अंतर्निहित सॉकेट कनेक्शन खुला रहता है और अगली बार जब मैं एक ही होस्ट में NSURLConnection बनाता हूं तो इसका पुन: उपयोग किया जाता है। यह एक समस्या है क्योंकि मुझे कभी-कभी होस्ट के साथ एक और एसएसएल हैंडशेक करने की ज़रूरत होती है, और चूंकि यह कनेक्शन का पुनः उपयोग कर रहा है, हैंडशेक पहले से ही किया जा चुका है। – jblack

0

ओएस एक्स 10.9 से शुरू, NSURLSession समाधान है।

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