【问题标题】:Resolving a hostname from Bonjour networking从 Bonjour 网络解析主机名
【发布时间】:2017-03-01 09:37:16
【问题描述】:

我有一个使用 JmDNS 的基于 Java 的服务器,该服务器是从 iOS 应用程序中发现的。

发现工作正常,这是由 NetServiceDelegate 执行以记录详细信息的回调:

public func netServiceDidResolveAddress(_ service: NetService) {
    guard let hostName = service.hostName else {
        return
    }

    mockServerUrl = "http://\(hostName):\(service.port)/analytics"
    Logger.log("Using mock server at \(mockServerUrl)", forLevel: .info)
}

这会产生一个如下所示的 URL: http://az-mbp-ether-lan.local.:9090

现在我发誓这是有效的,但是现在当我尝试使用 Alamofire 将数据发送到此端点时,它总是超时。

将主机名替换为目标机器的硬编码 IP 地址使其再次工作,因此发送数据的代码不存在根本问题。

上述形式的地址应以“.local”结尾。是否可以从与目标服务器位于同一网络的 iOS 设备解析?

【问题讨论】:

  • 委托方法netServiceDidResolveAddres用于解析IPv4和IPv6地址。对didFindService之后没有变化的主机名没有影响。
  • 当我检查地址字段中返回的地址时,我发现它是“127.0.0.1”,这对于从手机到服务器的连接似乎没有用。
  • 您必须从netServiceDidResolveAddress 方法中的addresses 数组中提取IPV4 或IPv6 地址,该数组是包含struct sockaddr 对象的(NS)Data 对象数组。
  • 是的,我做到了。在地址字段中返回的唯一地址是“127.0.0.1”:(

标签: ios swift bonjour nsnetservice


【解决方案1】:

问题出在 Java 服务器端。它通过调用 InetAddress.getLocalHost() 进行注册。这是返回环回地址。

我根据这个问题修改了我的代码以找到一个非环回地址: IP Address not obtained in java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多