Iphone 客户端未发现bonjour服务
我刚刚开始学习设计iphone应用程序,我正在尝试建立一个客户机-服务器环境。作为初学者,我希望首先确保我发布的服务对客户端可见。我在苹果文档的帮助下编写了服务器和客户端代码。然而,我发现尽管我的服务正在发布(netServiceWillPublish(NSNetService*)发送方被调用),但我的客户端并没有识别这个服务。在客户端,委托函数netServiceBrowserWillSearch:(NSNetServiceBrowser*)browser被称为使我相信客户端正在搜索服务。但是,从未调用didFindService委托函数。我不明白为什么这不起作用。我从不同的地方跟踪了客户端的示例代码,我的代码与他们的代码相匹配。在此方面提供一些帮助将不胜感激 我还有以下问题Iphone 客户端未发现bonjour服务,iphone,cocoa-touch,bonjour,nsnetservice,nsnetservicebrowser,Iphone,Cocoa Touch,Bonjour,Nsnetservice,Nsnetservicebrowser,我刚刚开始学习设计iphone应用程序,我正在尝试建立一个客户机-服务器环境。作为初学者,我希望首先确保我发布的服务对客户端可见。我在苹果文档的帮助下编写了服务器和客户端代码。然而,我发现尽管我的服务正在发布(netServiceWillPublish(NSNetService*)发送方被调用),但我的客户端并没有识别这个服务。在客户端,委托函数netServiceBrowserWillSearch:(NSNetServiceBrowser*)browser被称为使我相信客户端正在搜索服务。但是
NSNetServiceBrowser *serviceBrowser;
serviceBrowser = [[NSNetServiceBrowser alloc] init];
[serviceBrowser setDelegate:self];
[serviceBrowser searchForServicesOfType:@"_http._tcp." inDomain:@"local."];
这是发布服务的服务器端的代码片段
BOOL success;
int fd;
int err;
int junk;
struct sockaddr_in addr;
NSInteger port;
port = 0;
fd = socket(AF_INET, SOCK_STREAM, 0);
success = (fd != -1);
if(success) {
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = 0;
addr.sin_addr.s_addr = INADDR_ANY;
err = bind(fd, (const struct sockaddr*) &addr, sizeof(addr));
success = (err == 0);
}
if (success) {
err = listen(fd, 5);
success = (err == 0);
}
if (success) {
socklen_t addrLen;
addrLen = sizeof(addr);
err = getsockname(fd, (struct sockaddr *) &addr, &addrLen);
success = (err == 0);
if (success) {
assert( addrLen = sizeof(addr));
port = ntohs(addr.sin_port);
}
}
if (success) {
CFSocketContext context = { 0, (__bridge void *) self, NULL, NULL, NULL };
assert(self->_listeningSocket == NULL);
self->_listeningSocket = CFSocketCreateWithNative(NULL, fd, kCFSocketAcceptCallBack, AcceptCallBack, &context);
success = (self->_listeningSocket != NULL);
if (success) {
CFRunLoopSourceRef rls;
fd = -1; //listeningSocket is now responsible for closing the socket
rls = CFSocketCreateRunLoopSource(NULL, self.listeningSocket, 0);
assert(rls != NULL);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
CFRelease(rls);
}
}
if (success) {
self.netService = [[NSNetService alloc] initWithDomain:@"local." type:@"_http._tcp." name:@"test" port:port];
success = (self.netService != nil);
}
if (success) {
self.netService.delegate = self;
[self.netService publishWithOptions:NSNetServiceNoAutoRename];
}
if (success) {
assert(port != 0);
[self serverDidStartOnPort:port];
}
else {
[self stopServer:@"Start Failed"];
if (fd != -1) {
junk = close(fd);
assert(junk == 0);
}
}
这是一段代码片段,告诉您服务已发布,并打印出我的NSSocket对象的详细信息
- (void)netServiceWillPublish:(NSNetService *)sender {
NSLog(@"This function is getting called");
NSLog(@"sender.name %@",sender.name);
NSLog(@"sender.addresses %@",sender.addresses);
NSLog(@"sender.domain %@",sender.domain);
NSLog(@"sender.hostname %@",sender.hostName);
NSLog(@"sender.type %@",sender.type);
NSLog(@"sender.port %d",sender.port);
}
谢谢Vivek因为这个问题已经问了一周了,我希望你已经解决了你的问题。但如果您没有,我建议您使用像Bonjour Browser这样的应用程序来确保您的服务发布正确。它可以从商店(官方名称:“Discovery-Bonjour Browser”)以iOS应用程序的形式提供,或者您可以从下载Mac应用程序版本,因为这个问题已经提出一周了。我希望您已经解决了您的问题。但如果您没有,我建议您使用像Bonjour Browser这样的应用程序来确保您的服务发布正确。它可以通过商店的iOS应用程序(官方名称:“Discovery-Bonjour Browser”)获得,也可以从下载Mac应用程序版本