मैंने एसएसडीपी डिस्कवरी चलाने और नियंत्रकों को खोजने के लिए सफलतापूर्वक AsyncUdpSocket का उपयोग किया है।
प्रारंभ और सेटअप सॉकेट:
// AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
[ssdpSock setDelegate:self];
नोट पहली पंक्ति पर टिप्पणी की यहाँ मेरी कोड के टुकड़े कर रहे हैं। मुझे AsyncUdpSocket forums पर डुप्लीकेट के साथ कुछ समस्याएं मिलीं। मुझे नहीं लगता कि मैं उनका सामना कर रहा था लेकिन मैंने इसे किसी भी तरह से किया।
मैं त्रुटि जाँच जोड़ा, और यह उपयोगी था क्योंकि मेरे डीबगिंग के दौरान मैं सॉकेट बंद करने नहीं गया था और मैं हो रही सॉकेट सेटअप विफलताओं शुरू कर दिया:
NSError *socketError = nil;
if (![ssdpSock bindToPort:1900 error:&socketError]) {
NSLog(@"Failed binding socket: %@", [socketError localizedDescription]);
return statusController;
}
if(![ssdpSock joinMulticastGroup:@"239.255.255.250" error:&socketError]){
NSLog(@"Failed joining multicast group: %@", [socketError localizedDescription]);
return statusController;
}
if (![ssdpSock enableBroadcast:TRUE error:&socketError]){
NSLog(@"Failed enabling broadcast: %@", [socketError localizedDescription]);
return statusController;
}
[ssdpSock sendData:[self.discoverControllerString dataUsingEncoding:NSUTF8StringEncoding]
toHost:@"239.255.255.250"
port:1900
withTimeout:2
tag:1];
सूचना परिवर्तन मैं समय के लिए बाहर करने के लिए बना दिया है। और फिर अंततः सेटअप प्राप्त किया, और सॉकेट बंद कर दिया। सॉकेट बंद करें नोट करें। चूंकि मैं अपनी कक्षा में हूं जब मैं इसे चला रहा हूं - उपरोक्त कोड मेरे लिए काम नहीं करता है।
[ssdpSock receiveWithTimeout: 2 tag:1];
[NSTimer scheduledTimerWithTimeInterval: 5 target: self
selector:@selector(completeSearch:) userInfo: self repeats: NO];
[ssdpSock closeAfterSendingAndReceiving];
सबसे महत्वपूर्ण परिवर्तन शायद "नहीं" लौटा रहा था अगर मुझे मेरा नियंत्रक नहीं मिला। पहली बार आकस्मिक रूप से खोज संदेश स्वयं वापस आ रहा था। और जब मैं AsyncUdpSocket.h फ़ाइल को ध्यान से पढ़ता हूं - "नहीं" लौटाता है जब यह एक पैकेट नहीं है जिसे आप मदद की तलाश में हैं।
यह भी ध्यान दें कि मैं अपने कोड में एआरसी का उपयोग कर रहा हूं लेकिन मैंने एआरसी समर्थन के बिना AsyncUdpSocket संकलित किया।
-(void) completeSearch: (NSTimer *)t
{
NSLog(@"%s",__FUNCTION__);
//[ssdpSock close];
//ssdpSock = nil;
}
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock
didReceiveData:(NSData *)data
withTag:(long)tag
fromHost:(NSString *)host
port:(UInt16)port
{
NSLog(@"%s %ld %@ %d",__FUNCTION__,tag,host,port);
NSString *aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@",aStr);
NSString *compareString = [aStr stringByPaddingToLength:[self.responseString length] withString:@"." startingAtIndex:0];
//NSLog(@"%@", compareString);
//NSLog(@"%@", self.responseString);
if ([compareString isEqualToString:self.responseString])
{
NSLog(@"String Compare, Controller Found!");
[self.controllerList addObject:aStr];
//NSData *controllerIP = [aStr dataUsingEncoding:NSUTF8StringEncoding];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil];
return YES;
}
return NO;
}
हाय Savvybud, ठीक दिखता है, लेकिन मेरे सिर के शीर्ष से (यह कुछ समय पहले मैंने ऐसा किया था) मुझे लगता है कि आपकी समस्या bindToPort के साथ है। मुझे पूरा यकीन है कि यह बंदरगाह है कि संदेश वापस भेज दिए जाएंगे और 1 9 00 नहीं होने चाहिए क्योंकि यह मल्टीकास्ट के लिए आरक्षित है। यदि आप इसे शून्य पर सेट करते हैं तो सिस्टम एक आवंटित करेगा और इसे काम करना चाहिए। sendData ठीक दिखता है। –
जादू बुलेट डेव, आप आदमी हैं! – savvybud