Bonjour API を使用してレコードを登録しました。今、出版したばかりのレコードの内容を知りたいです。「デーモンのデフォルトを使用する」ことを意味するNULLホスト名を指定して作成しましたが、それが何であるかを照会する簡単な方法が見つかりません!
avahi を使えば簡単です。 を呼び出しavahi_client_get_host_name()
て、マシンのホスト名の開始値を取得します。
avahi と Bonjour の両方で、SRV レコードの値は登録の存続期間中に変更される可能性があります。登録が NULL ホスト名で行われた場合、レコードのホスト名は必要に応じて自動的に更新されます。ここで必要なのは、登録時にホスト名の初期値を取得する方法だけです。
私の Snow Leopard テスト マシンでは、デフォルトのマルチキャスト ホスト名がからのマシンの名前と同じではないgethostname(2)
ことに注意してください。
私が考えることができる4つの解決策:
- 私のプロセスでホスト名を取得します。どこかにあるかもしれません。プロセスのメモリ ダンプを検索した
strings(3)
ところ、アドレス空間でマルチキャスト ホスト名の 4 つのインスタンスが見つかりましたが、その名前が他の目的で使用されていることを考えると、これは偶然の一致である可能性があります。探している文字列がプロセスのどこかにあるとしても、それを正常に取得するための API が見つかりません。 - デーモンからホスト名を照会します。マッハポートを介して、それをフェッチするデーモンに送信できるクエリがあるかもしれません。API が見つかりません。関連するコードのチャンクは mDNSResponder の uDNS.c ファイルにあり、RPC インターフェイス経由で公開されていないようです。
- 登録したサービスを検索できました。ただし、これには多少のネットワーク トラフィックが含まれる可能性があるため、発生しないという保証がない限り、私はそうしたくありません。
uDNS.c のロジックを再実装します。次の組み合わせからマシンのホスト名を取得します。
- 動的 DNS 構成
- 静的に構成されたマルチキャスト ホスト名
- プライマリ インターフェイスの IPv4 アドレスの逆引き
gethostname(2)
具体的には、または同等のものを使用しません
そのロジックを再実装することは不可能に思えます。
現時点では、最初の SRV 登録の値を取得するためにルックアップを行う傾向がありますが、理想的ではないようです。正しい解決策は何ですか?