Ruby DNSSD Bonjour IP地址发现
背景 我正在尝试使用Ruby DNSSD来发现一些设备的IP地址 我的代码将正确发现设备的名称。我尝试使用名称.local访问设备。我尝试过这种方法:Ruby DNSSD Bonjour IP地址发现,ruby,sockets,bonjour,dns-sd,Ruby,Sockets,Bonjour,Dns Sd,背景 我正在尝试使用Ruby DNSSD来发现一些设备的IP地址 我的代码将正确发现设备的名称。我尝试使用名称.local访问设备。我尝试过这种方法: 如何找到他们的IP地址?或 使用主机名访问这些设备 更新 我向自己证明了我的理论,即Socket命令没有搜索/etc/hosts文件 我手动将我的三个redeye单元添加到/etc/hosts文件中,并能够解析IP地址 /etc/主持人 192.168.69.77 RedEye_B0105-92646.local. 192.168.69.
- 如何找到他们的IP地址?或
- 使用主机名访问这些设备李>
192.168.69.77 RedEye_B0105-92646.local.
192.168.69.75 RedEye_E0103-85245.local.
192.168.69.76 RedEye_B0104-99552.local.
代码
输出
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报告。浏览,可能是配置设置
2.我没有正确安装或配置mDNS服务器
3.还有一些冲突,如DNSMASQDNS-SD浏览操作的结果是DNS-SD服务名称,而不是主机名 要从服务名到连接,您需要使用服务名、服务域(不要硬编码“.local”)和接口号(如果Ruby包装器提供)启动DNS-SD解析操作,这些操作与提供给浏览回调的操作完全相同 如果解析操作成功,它将返回服务的主机名、端口(可能不是众所周知的端口)和一组包含元信息(特定于服务)的键值对,然后您可以使用这些信息建立连接 编辑:
换句话说,您还没有完成链接的示例。在故障排除过程中,我故意在名称后面添加
.local.
。我删除并重新安装了avahi,dnssd gem my code现在解析IP地址,而无需在/etc/hosts
文件中定义主机。我现在得到了我想要的东西,一个只有名字和IP地址的散列
代码
结果散列
{"RedEye_B0105-92646"=>"192.168.69.77", "RedEye_B0104-99552"=>"192.168.69.76", "RedEye_E0103-85245"=>"192.168.69.75"}
您仍在使用服务名称(
reply.name
)作为主机名。如果真是这样,那是巧合。我抄袭了一颗红宝石,想把我的话说得更清楚。谢谢。在我的例子中,我只对发现一个特定的目标感兴趣,因为它的名称不太可能改变,所以我不关心域的硬编码。以前,我尝试使用目标访问设备,但它不起作用。现在socket正在解析IP地址,我将再试一次。我的应用程序不支持通过目标名称进行访问。这不仅仅与域有关。如果您运行了这个示例,您会看到出现一个服务名称,如“*SlashDot,书呆子新闻,重要的东西”,并解析为SlashDot.org.:80。重点是说明服务的名称和服务的主机名没有连接。不要在服务名称的末尾打“.local.”,并期望得到一些可以可靠地插入getaddrinfo()的东西。
@@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"}