2

バックグラウンド

Ruby DNSSD を使用して、いくつかのデバイスの IP アドレスを検出しようとしています。

私のコードは、デバイスの名前を正しく検出します。NAME.local を使用してデバイスにアクセスしようとしました。私はこの方法を試しました: https://github.com/jmitchener/ruby-dnssd-test/blob/master/main.rb

  • IP アドレスを確認するにはどうすればよいですか? または
  • ホスト名を使用してそれらのデバイスにアクセスしますか?

アップデート

私は、Socket コマンドが /etc/hosts ファイルを超えて検索していないという私の理論を証明しました。

3 つの 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.

コード

  @@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 コマンドが IP 解決のために /etc/hosts ファイルを超えて検索しない理由
です
。 mDNS サーバーが正しくインストールまたは構成されていない
3. DNSMASQ など、他の何かが競合している

4

2 に答える 2

0

.local.トラブルシューティングの過程で、意図的に名前に をハードコーディングしました。avahi と dnssd gem を削除して再インストールしたところ、/etc/hostsファイルにホストが定義されていなくても、コードで IP アドレスが解決されるようになりました。名前と 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"}
于 2013-03-09T13:30:04.120 に答える
0

DNS-SD ブラウズ操作の結果は、ホスト名ではなく、DNS-SD サービス名です。

サービス名から接続を取得するには、サービス名、サービス ドメイン (「.local」をハードコードしないでください)、およびインターフェイス番号 (Ruby ラッパーが提供する場合) を使用して、DNS-SD 解決操作を開始する必要があります。ブラウズ コールバック。

解決操作が成功すると、サービスのホスト名、ポート (既知のポートではない可能性があります)、および接続を確立するために使用できるメタ情報 (サービス固有) を含む一連のキーと値のペアが返されます。 .

編集:

別の言い方をすれば、リンクした例のこの部分を実行していません。

于 2013-03-07T10:22:09.390 に答える