Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby DNSSD Bonjour IP地址发现_Ruby_Sockets_Bonjour_Dns Sd - Fatal编程技术网

Ruby DNSSD Bonjour IP地址发现

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.

背景

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

我的代码将正确发现设备的名称。我尝试使用名称.local访问设备。我尝试过这种方法:

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

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

我手动将我的三个redeye单元添加到/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.
代码

输出

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.还有一些冲突,如DNSMASQ

DNS-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"}