Iphone 客户端未发现bonjour服务

Iphone 客户端未发现bonjour服务,iphone,cocoa-touch,bonjour,nsnetservice,nsnetservicebrowser,Iphone,Cocoa Touch,Bonjour,Nsnetservice,Nsnetservicebrowser,我刚刚开始学习设计iphone应用程序,我正在尝试建立一个客户机-服务器环境。作为初学者,我希望首先确保我发布的服务对客户端可见。我在苹果文档的帮助下编写了服务器和客户端代码。然而,我发现尽管我的服务正在发布(netServiceWillPublish(NSNetService*)发送方被调用),但我的客户端并没有识别这个服务。在客户端,委托函数netServiceBrowserWillSearch:(NSNetServiceBrowser*)browser被称为使我相信客户端正在搜索服务。但是

我刚刚开始学习设计iphone应用程序,我正在尝试建立一个客户机-服务器环境。作为初学者,我希望首先确保我发布的服务对客户端可见。我在苹果文档的帮助下编写了服务器和客户端代码。然而,我发现尽管我的服务正在发布(netServiceWillPublish(NSNetService*)发送方被调用),但我的客户端并没有识别这个服务。在客户端,委托函数netServiceBrowserWillSearch:(NSNetServiceBrowser*)browser被称为使我相信客户端正在搜索服务。但是,从未调用didFindService委托函数。我不明白为什么这不起作用。我从不同的地方跟踪了客户端的示例代码,我的代码与他们的代码相匹配。在此方面提供一些帮助将不胜感激

我还有以下问题

  • 服务名称(与传输级别协议一起提供)可以是任何字符串吗?或者必须在中指定。除了服务发现之外,这还能解决什么问题呢

  • 当我在服务器端打印NSNetService对象的详细信息时(设置套接字并启动服务后),主机名被打印为(null),并且没有显示任何地址。从技术上讲,当服务打开时,这些值不应该设置为值吗?如果是,有人能告诉我我的代码哪里出错了吗

  • 我已经附加了我的项目的客户机和服务器代码块,在那里发布和浏览服务。非常感谢您的帮助,因为我一直在处理这个问题

    这是客户端用于浏览服务的代码片段

    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应用程序版本