我想要做的是在我的ipod touch上启用一个简单的bonjour服务。 在我发布我的自定义bonjour服务后,委托人没有得到“netServiceDidPublish:”调用。我还检查“netService:(NSNetService *)sender didNotPublish:”中没有任何错误消息。以下是我的代码部分:
// AsyncSocket class comes from an awesome project: cocoa async socket.
// http://code.google.com/p/cocoaasyncsocket/
AsyncSocket* listenSocket;
listenSocket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error;
if (![listenSocket acceptOnPort:0 error:&error])
{
NSLog(@"Error starting server: %@", error);
return NO;
}
int port = [listenSocket localPort];
NSLog(@"Server started on port: %hu", port);
isRunning = YES;
// register itself to bonjour service.
netService = [[[NSNetService alloc] initWithDomain:@"local."
type:@"_sampleservice._tcp"
name:@"myservice"
port:port] autorelease];
if (!netService)
{
NSLog(@"Failed to enable net service");
[listenSocket disconnect];
return NO;
}
[netService setDelegate:self];
[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
//[netService publishWithOptions:NSNetServiceNoAutoRename];
[netService publish];
在此代码部分之后,我可以获得“netServiceWillPublish”委托调用,但没有“netServiceDidPublish”有人有任何想法吗?提前谢谢。
答案 0 :(得分:6)
我发现了两件事。首先,除非您需要将其移动到其他runloop(或模式),否则不应调用-scheduleInRunLoop:forMode:
。默认情况下,它已经安排在当前的运行循环中。其次,您似乎是自动释放该服务,这意味着一旦您返回到runloop,它就会被释放并释放。你需要把它贴在伊娃或财产中并坚持下去。
答案 1 :(得分:2)
无需-scheduleInRunLoop:forMode
。实际上,根据证明你的NSNetService
类的库堆栈,你会得到不同的行为,有些会失败。您还需要retain
您的NSNet服务。
我在runLoop上安排NSNetService
或NSNetServiceBrowser
时学到了一些不同的行为:
Foundation
框架访问,在runloop上没有任何损害安排(在Mac OS X 10.5,10.6,10.7和10.8上测试)。libgnustep-base
)中编译的GNUStep ./configure --with-zeroconf-api=avahi
,它也可以正常工作,但在我的情况下,如果使用了很多NSNetService
个实例,我会遇到一些分段错误并释放。libgnustep-base
)中编译的GNUStep ./configure --with-zeroconf-api=mdns
,则无效。对于发布NSNetService(错误将在-72003
中)以及使用NSNetServiceBrowser进行浏览,您将收到-netService:didNotPublish:
错误(错误将在-netServiceBrowser:didNotSearch:
中出现)。使用Avahi的mDNS兼容性代码(libavahi-compat-libdnssd1
)和直接使用Apple的mDNS测试此方案,而不使用Avahi。