【问题标题】:NSNetService says it is published, but it isn't visible on the networkNSNetService 表示已发布,但在网络上不可见
【发布时间】:2020-04-12 13:27:46
【问题描述】:

我正在开发一个供我自己使用的小型 iOS 应用程序(至少最初是这样),我想我会使用 Bonjour 来配置两个 iOS 设备之间的网络。 我的服务器接口定义

NSNetService *netService;

并且实现使用以下代码来宣传它的存在:

const NSString *kSEBonjourServiceDomain = @"";      //use defaults
const NSString *kSEBonjourServiceName = @"_test._tcp.";

//...

netService = [[NSNetService alloc] initWithDomain:(NSString *)kSEBonjourServiceDomain type:(NSString *)kSEBonjourServiceName name:@"" port:sin.sin_port];
if (netService)
    {
    netService.delegate = self;
    netService.includesPeerToPeer = YES;
    [netService publish];
    }
else NSLog(@"Failed to create NSNetService");

当我启动服务器时,我的 NSNetService 对象确实调用了 -netServiceDidPublish: 委托方法,但是当我使用 Discovery 浏览网络上的 bonjour 服务时,我的服务没有出现。除了 const 字符串之外,此代码与我的一个 Mac 应用程序中的某些代码相同(按预期工作),也与 Apple 的示例代码非常相似。 我已经浏览了 Xcode 功能选项卡中的所有选项,以防我需要在那里添加一些东西,但我看不到任何相关内容。我还阅读了一堆文档和教程,这些文档和教程没有提到除此之外必须做任何事情,但是如果你将一个晦涩的构建设置设置为一个字符串您必须通过阅读去年 9 月的 watchOS 人机界面指南来了解。 那么,有人可以启发我吗?我错过了什么? 提前致谢!

【问题讨论】:

  • 您是否尝试过使用除@"" 以外的名称,可以安全地传递domain,但如果没有名称,DNS 名称将是._test._tcp,这可能会被解释为mDNS 为_test._tcp,因此在该域中搜索将不会在浏览器中产生任何结果。
  • 好吧,文档说“@""-在默认域集中注册服务。传递这个值,除非你有特定的理由不这样做”,但我也试过@"local"
  • 我说的不是domain,我说的是namedomain 上的文档很清楚,但我认为您需要一个 name 才能在浏览器中实际显示注册。
  • 如果您传入一个空字符串作为名称,它将使用设备名称。文档也很清楚这一点,我可以看到它在我的 -netServiceDidPublish: 方法中工作,该方法记录了使用的名称。实际上,我之前生成了一个更长的名称,但将其缩减为以防名称超出文档中的内容的限制。
  • 是的,由于初始化程序过载,在文档中错过了这一点。您是否尝试过使用dns-sd -B 查看正在注册的内容?想知道问题是否不在注册方面,而是在发现方面。

标签: cocoa bonjour


【解决方案1】:

事实证明,由于我的代码中其他地方出现了一个愚蠢的错误,当我注册我的 NSNetService 时,sin.sin_port 被设置为 0。尽管 NSNetService 不认为这是一个问题,但它会导致服务浏览器忽略该服务。 所以答案是,端口为 0 的服务将注册而不会出错,但不会工作。 感谢 gaige 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2016-04-05
    相关资源
    最近更新 更多