我已經成功地使用AsyncUdpSocket來運行SSDP發現並找到控制器。這裏是我的代碼片段:
初始化和設置插座:
// 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文件時 - 當它不是你正在尋求幫助的數據包時返回「NO」。
另請注意,我在我的代碼中使用ARC,但我編譯了沒有ARC支持的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。我很確定這是返回消息將被髮送的端口,不應該是1900,因爲這是爲多播保留的。如果你設置爲零,那麼系統將分配一個,它應該工作。 sendData看起來很好。 – 2011-01-28 07:42:58
Magic Bullet戴夫,你是男人! – savvybud 2011-01-30 02:51:36