【问题标题】:Ruby DNSSD Bonjour IP address discoveryRuby DNSSD Bonjour IP 地址发现
【发布时间】:2013-03-01 21:53:25
【问题描述】:

背景

我正在尝试使用 Ruby DNSSD 来发现一些设备的 IP 地址。

我的代码将正确发现设备的名称。我尝试使用 NAME.local 访问设备。这个方法我试过了:https://github.com/jmitchener/ruby-dnssd-test/blob/master/main.rb

  • 如何找到他们的 IP 地址?或者
  • 使用主机名访问那些设备?

更新

我向自己证明了我的理论,即 Socket 命令没有搜索到 /etc/hosts 文件

我手动将我的三个 redeye 设备添加到 /etc/hosts 文件中,并且能够解析 IP 地址。

/etc/hosts

192.168.69.77   RedEye_B0105-92646.local.
192.168.69.75   RedEye_E0103-85245.local.
192.168.69.76   RedEye_B0104-99552.local.

代码

  @@reIP = Hash.new
  DNSSD.browse '_tf_redeye._tcp' do |reply|
    puts reply.name
    addr = Socket.getaddrinfo(reply.name + ".local.", nil, Socket::AF_INET)
    @@reIP[reply.name] = addr
    puts @@reIP
  end

输出

RedEye_B0105-92646
{"RedEye_B0105-92646"=>[["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 1, 6], ["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 2, 17], ["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 3, 0]]}
RedEye_E0103-85245
{"RedEye_B0105-92646"=>[["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 1, 6], ["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 2, 17], ["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 3, 0]], "RedEye_E0103-85245"=>[["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 1, 6], ["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 2, 17], ["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 3, 0]]}
RedEye_B0104-99552
{"RedEye_B0105-92646"=>[["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 1, 6], ["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 2, 17], ["AF_INET", 0, "192.168.69.77", "192.168.69.77", 2, 3, 0]], "RedEye_E0103-85245"=>[["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 1, 6], ["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 2, 17], ["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 3, 0]], "RedEye_B0104-99552"=>[["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 1, 6], ["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 2, 17], ["AF_INET", 0, "192.168.69.76", "192.168.69.76", 2, 3, 0]]}

现在的问题是为什么 Socket 命令不搜索 /etc/hosts 文件以进行 IP 解析
1. AVAHI 和/或 DNSSD 没有缓存地址,因为它们是由 DNSSD.browse 报告的,可能是配置设置
2. 我没有正确安装或配置 mDNS 服务器
3. 其他有冲突的东西,比如 DNSMASQ

【问题讨论】:

    标签: ruby sockets bonjour dns-sd


    【解决方案1】:

    DNS-SD 浏览操作的结果是 DNS-SD 服务名称,而不是主机名。

    要从服务名到连接,您需要准确地使用服务名、服务域(不要硬编码“.local”)和接口号(如果 Ruby 包装器提供它)启动 DNS-SD 解析操作提供给浏览回调。

    如果解析操作成功,它将返回服务的主机名、端口(可能不是众所周知的端口)和一组包含元信息(特定于服务)的键值对,然后您可以使用它们来建立连接。

    编辑:

    换句话说,您还没有完成您链接的示例的this part

    【讨论】:

      【解决方案2】:

      在故障排除过程中,我故意硬编码将.local. 附加到名称中。我删除并重新安装了 avahi 和 dnssd gem,我的代码现在可以解析 IP 地址,而无需在 /etc/hosts 文件中定义主机。我现在得到了我想要的,只有名称和 IP 地址的哈希。

      代码

        @@reIP = Hash.new
        DNSSD.browse '_tf_redeye._tcp.' do |reply|
          addr = Socket.getaddrinfo(reply.name + ".local.", nil, Socket::AF_INET)
          @@reIP[reply.name] = addr[0][2]
        end
      

      产生的哈希

      {"RedEye_B0105-92646"=>"192.168.69.77", "RedEye_B0104-99552"=>"192.168.69.76", "RedEye_E0103-85245"=>"192.168.69.75"}
      

      【讨论】:

      • 您仍在使用服务名称 (reply.name) 作为主机名。如果这行得通,那是巧合。我拼凑了一个 Ruby example,试图让我说的更清楚。
      • 谢谢。就我而言,我只对发现一个名称不太可能更改的特定目标感兴趣,因此我不关心对域进行硬编码。以前,我尝试使用目标访问设备,但没有成功。既然套接字正在解析 IP 地址,我将再试一次。
      • 我的应用程序不支持通过目标名称访问。
      • 这不仅仅是关于域。如果您运行了该示例,您会看到类似“* SlashDot, News for Nerds, Stuff that Matters”的服务名称出现并被解析为 slashdot.org.:80。重点是说明服务的名称和服务的主机名没有连接。不要打“.local”。在服务名称的末尾,并期望得到可以以任何可靠性插入 getaddrinfo() 的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2012-01-30
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多