2012-10-28 29 views
6

मेरे पास नेटवर्क पर एक डिवाइस है जो यूडीपी के माध्यम से बहुत छोटी फ़ाइल को मल्टीकास्टिंग कर रहा है। आईओएस ऐप जो मैं विकसित कर रहा हूं वह इन पैकेट को पढ़ने के लिए ज़िम्मेदार है और मैंने ऐसा करने के लिए GCDAsyncUdpSocket का उपयोग करना चुना है। फ़ाइल हर आधे सेकेंड को भेजी जाती है, हालांकि मुझे इसे लगभग प्राप्त नहीं होता है (केवल हर 3-10 सेकेंड प्राप्त होता है)।आईओएस पर GCDAsyncUdpSocket गायब मल्टीकास्टेड डेटाग्राम

सोच रहा है कि यह डिवाइस के साथ एक मुद्दा हो सकता है, मैंने वायरसहार्क के साथ यातायात की निगरानी शुरू कर दी। ऐसा लगता है कि जब तक मैं वायरसहार्क में "मॉनीटर मोड" सक्षम नहीं करता, तब तक मैं अपने ऐप में जो देख रहा था उसे प्रतिबिंबित करने के लिए दिखाई दिया, जिस बिंदु पर प्रत्येक यूडीपी पैकेट पर कब्जा कर लिया गया था। इसके अलावा, आईओएस सिम्युलेटर ने सभी लापता पैकेट प्राप्त करना शुरू कर दिया क्योंकि यह उस मैक के साथ एनआईसी साझा करता है जिस पर मैं विकास कर रहा हूं।

क्या आईओएस डिवाइस पर "मॉनिटर मोड" सक्षम करने का कोई तरीका है या मुझे याद आ रही है जो लापता पैकेट को आने की अनुमति देगी? मैं यह भी देखता हूं कि GCDAsyncUdpSocket में एक रीडस्ट्रीम विधि है। शायद मुझे शुरू करने की बजाय इसे इस्तेमाल करने की ज़रूरत है? हालांकि मुझे नहीं पता कि उद्देश्य-सी में धाराएं कैसे स्थापित करें, यदि ऐसा है। किसी को भी, जो भविष्य में यहाँ देख आता है के लिए

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    NSLog(@"View Loaded"); 
    [self setupSocket];    
} 

- (void)setupSocket 
{ 
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 
    NSError *error = nil; 
    if (![udpSocket bindToPort:5555 error:&error]) 
    { 
     NSLog(@"Error binding to port: %@", error); 
     return; 
    } 
    if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){ 
     NSLog(@"Error connecting to multicast group: %@", error); 
     return; 
    } 
    if (![udpSocket beginReceiving:&error]) 
    { 
     NSLog(@"Error receiving: %@", error); 
     return; 
    } 
    NSLog(@"Socket Ready"); 
} 

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data 
     fromAddress:(NSData *)address 
withFilterContext:(id)filterContext 
{ 
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    if (msg) 
    { 
     NSLog(@"RCV: %@", msg); 
    } 
    else 
    { 
     NSString *host = nil; 
     uint16_t port = 0; 
     [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address]; 
     NSLog(@"Unknown message from : %@:%hu", host, port); 
    } 
} 

समाधान::

यहाँ के रूप में यह अब है अपने परीक्षण कोड है

ilmiacs के जवाब के आधार पर, मैं करने में सक्षम था लक्ष्य आईओएस डिवाइस को पिंग करके लापता पैकेट की संख्या को काफी कम करता है। अब मैं इसे, मैं एप्पल के आईओएस पिंग उदाहरण पर गौर करें और देखें कि मैं डिवाइस हो सकता है अगर करने जा रहा हूँ एक मैक IOS डिवाइस पिंग के साथ चल रहा है कि

sudo ping -i 0.2 -s 4 <Target IP> 

- Mac का उपयोग करके, मैं टर्मिनल में इस भाग गया अपने स्वयं के वायरलेस एडाप्टर को उत्तेजित करने के लिए खुद को पिंग करें (127.0.0.1)।

+0

आपको पता है कि यूडीपी पैकेट ** ** गारंटी डिजाइन द्वारा वितरित किए जाने वाले नहीं हैं? आपके आवेदन को इस मामले को संभालने में सक्षम होना चाहिए। –

+0

हां, मुझे पता है कि यूडीपी अविश्वसनीय है, लेकिन क्या यह वास्तव में उन कई पैकेटों का कारण बन सकता है जो बेकार हो रहे हैं? साथ ही, ऐप को बिना किसी समस्या के प्रत्येक पैकेट प्राप्त होता है जब तक कि एनआईसी मॉनिटर मोड सक्षम हो। – Squatch

+0

@Squatch क्या आप बता सकते हैं कि आपने किस डिवाइस का उपयोग किया था? –

उत्तर

12

आईओएस उपकरणों के लिए नेटवर्किंग ऐप्स पर मेरे काम के माध्यम से मैंने खुलासा किया है कि उनके नेटवर्क एडेप्टर के दो अलग-अलग तरीके हैं, चलिए उन्हें सक्रिय और निष्क्रिय कहते हैं। मैं इस पर कोई दस्तावेज खोजने का प्रबंधन नहीं किया था।

  1. जब तक सक्रिय मोड में, अनुकूलक काफी उत्तरदायी है: यहाँ मेरी निष्कर्ष हैं। मेरे पास 3-5ms का प्रतिक्रिया समय है।

  2. निष्क्रियता के कुछ समय बाद, आईओएस का नेटवर्क एडाप्टर निष्क्रिय से निष्क्रिय मोड में आता है। ऐसा होने का समय, वास्तविक डिवाइस मॉडल पर निर्भर करता है। तीसरा जीन आईपैड यह लगभग 200 एमएमएस है। आईफोन 4 के लिए यह 50 एमएमएस की तरह है।

  3. एक पिंग अनुरोध या एक टीसीपी पैकेट एडाप्टर निष्क्रिय से सक्रिय मोड में स्थानांतरित करेगा। यह लगभग 200ms के औसत के साथ 50ms से 800ms तक कुछ भी ले सकता है।

यह व्यवहार पूरी तरह से पिंग कमांड जारी करके पुन: उत्पन्न होता है। जैसे

ping -i 0.2 <ios-device-ip> 

पिंग अंतराल 200ms पर सेट करता है और सक्रिय स्थिति में मेरे आईपैड नेटवर्क एडाप्टर को रखता है।

यह व्यवहार आपके अवलोकनों के साथ पूरी तरह से संगत है, अगर निष्क्रिय मोड में एडाप्टर (अधिकतर नहीं) यूडीपी पैकेट को अनदेखा करता है। वायरशर्क गतिविधि शायद इसे सक्रिय मोड में रखती है, तो यह यूडीपी प्राप्त करेगी।

बाहर पिंग चाल में मदद करता है या नहीं।

एक शायद खोलने और डिवाइस पर ही दो सॉकेट जोड़ने और नियमित रूप से अपने आप पैकेट भेजने के द्वारा सक्रिय स्थिति में iDevice के नेटवर्क एडाप्टर रख सकता है। यह कुछ न्यूनतम ओवरहेड पेश करेगा।

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

उम्मीद है कि इससे मदद मिलती है।

+0

Hmmmm caled नहीं बहुत ही दिलचस्प कहा जाता है। मैंने कभी कोशिश करने के लिए सोचा नहीं होगा। मैं आज रात कोशिश करूँगा। – Squatch

+0

हां, हम कम से कम एक महीने के लिए विलंबता व्यवहार के बारे में परेशान थे। ;-) – ilmiacs

+0

यह काम किया! मुझे अभी भी कुछ पैकेट याद आ रही हैं लेकिन यह एक नगण्य राशि है। बहुत बहुत धन्यवाद। – Squatch

1

मुझे एक ही समस्या थी।

नेटवर्क गतिविधि सूचक शुरू मेरे लिए है कि समस्या का समाधान:

UIApplication* app = [UIApplication sharedApplication]; 
app.networkActivityIndicatorVisible = YES; 
0

आप iOS डिवाइस पर पैकेट को देखना चाहते हैं, तो आप एक मैक के लिए अपने iOS डिवाइस पर टेदर और shell command rvictl का उपयोग कर वाईफ़ाई अनुकूलक माउंट कर सकते हैं । फिर आप अपने आईओएस डिवाइस पर अपने 802.11 इंटरफेस पर यातायात की निगरानी के लिए वायरशर्क, टीसीपीडम्प इत्यादि का उपयोग कर सकते हैं।

जहां तक ​​3 से 7 सेकेंड तक डेटा प्राप्त नहीं होता है - अधिकतर संभावना है कि आपका डिवाइस पावर सेविंग मोड (आईईईई पीएसएम) में प्रवेश कर रहा है जो एक 802.11 सुविधा है जो अनिवार्य रूप से वायरलेस एनआईसी को सोने के लिए रखती है।
PSM मोड can yield poor performance on devices - विशेष रूप से अपने मामले जहां डेटा की आवधिक फटने हर 1/2 दूसरा है में। आपका आवधिक पिंग एनआईसी को जगा रहा है।