मेरे पास नेटवर्क पर एक डिवाइस है जो यूडीपी के माध्यम से बहुत छोटी फ़ाइल को मल्टीकास्टिंग कर रहा है। आईओएस ऐप जो मैं विकसित कर रहा हूं वह इन पैकेट को पढ़ने के लिए ज़िम्मेदार है और मैंने ऐसा करने के लिए 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)।
आपको पता है कि यूडीपी पैकेट ** ** गारंटी डिजाइन द्वारा वितरित किए जाने वाले नहीं हैं? आपके आवेदन को इस मामले को संभालने में सक्षम होना चाहिए। –
हां, मुझे पता है कि यूडीपी अविश्वसनीय है, लेकिन क्या यह वास्तव में उन कई पैकेटों का कारण बन सकता है जो बेकार हो रहे हैं? साथ ही, ऐप को बिना किसी समस्या के प्रत्येक पैकेट प्राप्त होता है जब तक कि एनआईसी मॉनिटर मोड सक्षम हो। – Squatch
@Squatch क्या आप बता सकते हैं कि आपने किस डिवाइस का उपयोग किया था? –