背景
我正在尝试使用Ruby DNSSD来发现一些设备的IP地址。
我的代码会正确发现设备的名称。我尝试使用NAME.local访问设备。我尝试过这种方法:https://github.com/jmitchener/ruby-dnssd-test/blob/master/main.rb
更新
我向自己证明我的理论是Socket命令没有搜索过/ etc / hosts文件
我手动将我的三个红眼单元添加到/ etc / hosts文件,并且能够解析IP地址。
的/ etc /主机
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
答案 0 :(得分:0)
DNS-SD浏览操作的结果是DNS-SD服务名称,而不是主机名。
要从服务名称获取连接,您需要使用服务名称,服务域(不要硬编码“.local”)和接口号(如果Ruby包装器提供它)来启动DNS-SD解析操作提供给浏览回调。
如果解析操作成功,它将返回服务的主机名,端口(可能不是众所周知的端口)和一组包含元信息(特定于服务)的键值对,然后您可以使用它们建立联系。
编辑:
换句话说,你没有完成你所链接的例子的this part。
答案 1 :(得分:0)
我故意硬编码在故障排除过程中将.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"}