2010-07-25 5 views
5

काम करता है मुझे एक आईफोन से 3 जी पर यूडीपी पैकेट भेजते समय एक अजीब समस्या है। लगभग हर बार मेरा आवेदन नेटवर्क निष्क्रियता की लंबी अवधि के बाद शुरू होता है (उदाहरण के लिए फोन नींद मोड से आता है या यह सिर्फ 3 जी कनेक्शन प्राप्त करता है), मेरा आवेदन किसी भी यूडीपी पैकेट भेजने में सक्षम नहीं है। मुझे CFSocketSendData से kCFSocketError त्रुटि स्थिति मिलती है। आवेदन तर्क पैकेट को समय-समय पर प्रत्येक पांच सेकंड भेजने की कोशिश करता है, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं इसे चलाने में कितना समय देता हूं, यह विफल रहता है। हालांकि, जब मैं एप्लिकेशन को पृष्ठभूमि में खोलता हूं और खोलता हूं, उदाहरण के लिए, सफारी में एक वेब पेज (जबकि एप्लिकेशन पृष्ठभूमि पर अभी भी असफल रहा है), एप्लिकेशन अचानक काम करना शुरू कर देता है। असल में, यह अन्य नेटवर्क गतिविधि (सफारी, मैप्स इत्यादि से) जैसा लगता है "वास्तविक के लिए नेटवर्किंग बंद कर देता है"। उदाहरण के लिए मुझे नेटवर्क प्रारंभिकरण के संदर्भ में कुछ भी विशेष करने की ज़रूरत है?आईफोन पर यूडीपी पैकेट भेजना एक नए नए 3 जी कनेक्शन में विफल रहता है, लेकिन अन्यथा

CFSocketRef cfSocket = CFSocketCreate(NULL, 0, SOCK_DGRAM, IPPROTO_UDP, kCFSocketNoCallBack, NULL, NULL); 
if (!cfSocket) 
{ 
    // snip: some error handling 
} 

struct sockaddr_in addr; 
// snip: init addr 

CFDataRef cfAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr)); 

CFSocketError sendPacketResult = CFSocketSendData(cfSocket, cfAddr, cfPacketData, 0.0); 
if (sendPacketResult != kCFSocketSuccess) 
{ 
    // try again in 5 seconds 
} 

यह सब Wi-Fi पर बिना किसी समस्या के ठीक काम करता है:

इस कोड मैं यूडीपी पैकेट भेजने के लिए उपयोग कर रहा हूँ का एक सरलीकृत टुकड़ा है।

निष्पक्ष होने के लिए, मुझे लगता है कि मैंने कभी-कभी मानक आईफोन अनुप्रयोगों (सफारी, मानचित्र, ...) में एक ही व्यवहार देखा है (लेकिन कभी-कभी)। कभी-कभी वे कनेक्ट करने से इनकार करते हैं (यहां तक ​​कि सोचा कि मैं 3 जी आइकन देखता हूं) और मुझे उन्हें बंद करने और फिर से खोलने की आवश्यकता है। लेकिन यह बहुत दुर्लभ है।

संपादित करें: संभावित रूप से संबंधित प्रश्न: On iPhone, what does EPERM (errno == 1) mean in reponse to send() of UDP data?

+0

कभी इसे काम करने के लिए मिलता है? –

उत्तर

4

3 जी टीसीपी/आईपी नेटवर्क इंटरफेस ऑपरेटिंग सिस्टम की खुशी पर आईओएस द्वारा फेंक दिया जा सकता है, आम तौर पर बिजली से बचाने के कारणों के लिए यदि कोई ट्रैफिक नहीं चल रहा है। बीएसडी सॉकेट का उपयोग करते समय (उदाहरण के लिए, यूडीपी के लिए, चूंकि कोई यूडीपी सेब नेटवर्किंग फ्रेमवर्क नहीं है) 3 जी नेटवर्क इंटरफ़ेस सुनिश्चित करने के लिए कोई प्रकाशित ओएस कॉल नहीं है। लेकिन आंतरिक रूप से ऐप्पल की सीएफएसकेटस्ट्रीम कक्षा में निजी ऐप्पल कॉल मौजूद हैं जो इंटरफ़ेस को जगाते हैं।

तो समाधान किसी जगह पर एक CFSocketStream खोलने के लिए प्रतीत होता है। यह कुछ समय के लिए इंटरफेस जगाएगा। जब तक आप एक मिनट में एक बार CFSocketStream पर डेटा भेजते हैं या तो कनेक्शन और नेटवर्क इंटरफ़ेस बने रहेगा।

यह इतना आकर्षक नहीं है, क्योंकि यह केवल साइड इफेक्ट द्वारा काम कर रहा है। लेकिन यह इस बिंदु पर एकमात्र समाधान प्रतीत होता है।

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