SSDP Discovery'yi çalıştırmak ve denetleyicileri bulmak için AsyncUdpSocket'ı başarıyla kullandım.
başlat ve kurulum soket: İlk satır dışarı yorumladı
// AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
[ssdpSock setDelegate:self];
Not İşte benim kod snippet'leridir. AsyncUdpSocket forums'da yinelenen bazı sorunlar buldum. Onlarla yüzleştiğimi sanmıyorum ama yine de yaptım. Ben yuvalarını kapatılıyor değildi ve ben alıyorum soket kurulum hataları başladı çünkü benim ayıklama sırasında
hata denetimi eklendi ve yararlı oldu:
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];
Bildirim ben zaman aşımına yapmış olduğunuz değişiklikleri. Ve sonra nihayet kurulumunu yaptı ve soketi kapattı. Soketi kapatın. Bunu yaparken kendi sınıfımda olduğum için - yukarıdaki kod benim için çalışmadı.
[ssdpSock receiveWithTimeout: 2 tag:1];
[NSTimer scheduledTimerWithTimeInterval: 5 target: self
selector:@selector(completeSearch:) userInfo: self repeats: NO];
[ssdpSock closeAfterSendingAndReceiving];
En önemli değişiklik, denetleyicimi bulamadığı takdirde "NO" döndürüyordu. İlk alma tesadüfen keşif mesajının kendisi geri geldi. Ve AsyncUdpSocket.h dosyasını dikkatli bir şekilde okurken, bir paket olmadığında "HAYIR" ifadesini döndürdüğünüzde, yardım ettiniz.
Ayrıca, kodumda ARC kullanıyorum ama ARC desteği olmadan AsyncUdpSocket'i derledim.
-(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;
}
Merhaba Savvybud, iyi görünüyor, ama başımın tepesinden (bir süre önce bunu yaptım) bindToPort ile sorununuzun olduğunu düşünüyorum. Eminim ki bu mesajlar gönderilecek ve 1900 olmamaları gereken bağlantı noktasıdır. Bunu sıfır olarak ayarlarsanız, sistem bir tane ayırır ve çalışması gerekir. SendData iyi görünüyor. –
Sihirli Kurşun Dave, sen adamsın! – savvybud