ZeroConfを使用して複数のサービスを区別するための適切な方法
質問
電話機と同様にコンピュータ上で実行されるソフトウェアを書いています。
サービスは通信にHTTP APIを使用し、zeroconfを使用してローカルネットワーク上で公開されます。
最初はサービスの種類として_http._tcp.
を使用してサービスを公開しましたが、私のNASとMy Music Receiver(!)の両方がその正確なサービスタイプで自分自身を放送することをすばやく発見しました。
だから、私のサービスとHTTPを使用しているその他のサービスをどのように区別するかという問題が発生しました。
選択肢
別のサービスタイプを使って
確かに最も簡単な方法で最も簡単な方法で(ほとんど)保証されていないサービスは拾われません。
しかし、 1 New Services はIANAに登録されるべきです。これは明らかに必要ではありませんが、彼らがそれを推薦するように見えているので、それが間違った方法であるように感じる
TXTレコード
を使用して> apple
サービスが登録されている場合、3つの関連DNSレコードが作成されます。サービス(SRV)レコード、ポインタ(PTR)レコード、テキスト(TXT)レコード。 TXTレコードには、サービスを解決または使用するために必要な追加のデータも含まれていますが、頻繁には空です。
確かにそれがそれをするための正しい方法であるかもしれないように感じますが、私はまだわからないので、フィールドに含まれるものの説明を見つけるのは難しいです。
私の最初のものは、それが実際にどのサービスがあるかを見るために解析されるような<service_name>-<version>
のようなものを置くことです。
私のNASはモデルとバージョン番号を識別するためにこれを使用しているようです。
サービスと話してみてください
サービスを見つけた後、既知のエンドポイントでHEAD
要求を実行し、サービスによって設定された既知のヘッダーを探します。
これはかなり遅いアプローチのように感じ、私の受信者にHEAD
要求をすることを知っている人は何をします。
明確にするために、この質問は特定の言語やフレームワークとは関係ありません。Zeroconfの概念についてです。
私はいくつかのコードを表示することができますが、それがどのように役立つかはわかりません。
解決
最初に、あなたが広告宣伝しているサービスは、 RFC 2782で定義されている_http
の資格を実際に満たしていますか。 。具体的には、トランスポートのHTTPを使用するだけでなく、
- は、「代表的な」Webブラウザクライアントソフトウェア、および で表示できます。
- は主に人間のユーザーによって見られるように意図されています。
いいえの場合は、自分のサービスタイプを登録します(httpをトランスポートとして使用する他のサービスがありますが、それらの資格を満たしていますが、サービス名のサフィックスとして-http
があるため、pgpkey-http
、senteo-http
)を参照してください。 。
YESの場合、RFCの厳密なものがどのように厳しいかに応じて行く方法がいくつかあります。あなたの質問ですでに注意しているように、 txt レコードを追加するだけで最も厳密です。 iTunesは、 txt レコードの形式で登録します。
もう少し厳しいと感じている場合、RFCはHTTPのxul-http
、iTSh Version=196618
TXTレコードが存在することを明示的に述べています。おそらく誰かがこれでチャイムすることができますが、私はすでに既存のエントリにTXTレコードを追加するかどうかについて多くの議論を見ていません。それで、それ以外の方法はアルゴリズムインスタンス名だけです。たとえば、デバイス名にサフィックス "-nickLasAservice"を追加します。うまくいけば、それをローカルネットワークに固有の名前を与えますが、まだサフィックスを探しているだけで、PTRレコードによってサービスを簡単に拾うことができるようにそれを作ることができます。