Я успешно использовал AsyncUdpSocket для запуска SSDP Discovery и поиска контроллеров. Вот мои фрагменты кода:
Инициализируйте и настройте сокет:
// AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
[ssdpSock setDelegate:self];
Обратите внимание на первую строку, закомментированную. Я обнаружил на форумах AsyncUdpSocket некоторые проблемы с дубликатами. Я не думаю, что я столкнулся с ними, но я сделал это в любом случае.
Я добавил проверку ошибок, и это было полезно, потому что во время отладки я не закрывал сокеты, и у меня начались сбои установки сокетов:
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, мне помогло возвращение «НЕТ», когда это не тот пакет, который вы ищете.
Также обратите внимание, что я использую ARC в своем коде, но я скомпилировал AsyncUdpSocket без поддержки ARC.
-(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;
}
person
Ashu Joshi
schedule
02.03.2012