2010-02-14 22 views
5

मुझे अपने सॉकेट परीक्षण एप्लिकेशन के साथ एक दिलचस्प समस्या मिली है।आईफोन सॉकेट बड़ी संख्या में डेटा स्थानान्तरण के बाद विफल रहता है

मैंने एक AcceptCallback फ़ंक्शन के साथ एक सुनवाई सॉकेट स्थापित किया है।

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
            (CFStringRef) self.clientService.hostName, 
            self.clientService.port, 
            &myReadStream, 
            &myWriteStream); 

और मैं डेटा वापस सुन सॉकेट myReadStream और myWriteStream, जो दोनों के मैं उनके NSStream समकक्ष डाली गए हैं करने के लिए भेज दिया है: मैं का उपयोग कर सुन सॉकेट से कनेक्ट हैं।

समस्या डेटा के कई अलग-अलग पैकेट भेजने के बाद होती है। पैकेट का आकार कोई फर्क नहीं पड़ता, यह पैकेट की संख्या है (या CFStreamCreatePairWithSocketToHost creations की संख्या) जो त्रुटि को पेश करने लगता है।

बाद मैं पैकेट (शायद करीब 100 या 200) की टन भेजने के लिए, जब मैं NSOutputStream पर डेटा भेजने की कोशिश मैं NSStreamEvent कॉलबैक में कोई त्रुटि मिलती है:, तब

Operation could not be completed. (NSUnknownErrorDomain error 8.)

अगर मैं बनाने की कोशिश एक नई सेवा और इसे नेटवर्क पर प्रकाशित करें जब मैं नए पते को हल करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है। यह मुझे NSNetService में 10 का त्रुटि कोड देता है: didNotResolve प्रतिनिधि विधि (भी, त्रुटि विवरण यहां खाली है)।

यह लगभग है जैसे सुनना सॉकेट "पूर्ण" है, लेकिन ऐसा लगता है कि यह ठीक काम कर रहा है क्योंकि जब मैं CFSocketIsValid की जांच करता हूं तो यह सच हो जाता है।

मैं स्टंप हो गया हूं और स्थिति को डीबग करने की कोशिश कर कई घंटे बिताए हैं ... कोई भी विचार किसी को भी? धन्यवाद।

+0

आग में अधिक ईंधन जोड़ने के लिए, वास्तविक डिवाइस पर चलने वाले परिणामों को सूचीबद्ध करना उपयोगी होगा। नेटवर्किंग प्रदर्शन निश्चित रूप से भौतिक और नकली के बीच बदलता रहता है। –

+0

हाँ, मैंने सत्यापित किया कि डिवाइस पर भी वही समस्या होती है। मुझे एक ही त्रुटि मिलती है। मैंने बस असफल होने से पहले किए जा रहे कनेक्शनों की संख्या में एक काउंटर जोड़ा, और यह 236 सफल कनेक्शन/स्थानान्तरण बनाता है। 237 वां हमेशा विफल रहता है। यह आश्चर्यजनक रूप से 255 के करीब है, जो मुझे लगता है कि यह सॉकेट बनाए रखने वाले कनेक्शन के साथ कुछ प्रकार की मेमोरी रिसाव हो सकती है। सुनिश्चित नहीं है ... – devinkb

+0

अधिक सुराग: जब डिवाइस पर एप्लिकेशन चल रहा है तो 23 9 सफल स्थानान्तरण हैं। 240 वां हमेशा विफल रहता है। आईफोन पर सॉकेट और सिम्युलेटर पर सॉकेट के बीच क्या अंतर है? – devinkb

उत्तर

2

ठीक है, मैंने इस मुद्दे को समझ लिया।

जब एक सॉकेट से कनेक्ट कर रहा है और निम्नलिखित के साथ पढ़ने आरंभ और धारा लिखने के रूप में,:

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) self.clientService.hostName, self.clientService.port, &myInputStream, &myWriteStream); 

आप आप निम्नलिखित चर सेट इतना है कि निचले स्तर बीएसडी धारा बंद कर देता है जब आप बंद सुनिश्चित करने की आवश्यकता CFStream या NSStream (मेरे मामले में मैं एक NSStream प्रकार के CFStream डाली):

CFReadStreamSetProperty(myReadStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 
CFWriteStreamSetProperty(myWriteStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 

आप इस संपत्ति बीएसडी धारा वास्तव में कभी बंद कर देता है निर्धारित नहीं करते हैं और आप सॉकेट कनेक्शन की अधिकतम संख्या में किसी प्रकार का मारा - सुनिश्चित नहीं है कि समस्या क्या है।

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