3

私は電話だけでなくコンピューターでも動作するソフトウェアを書いています。

このサービスは通信に HTTP API を使用し、Zeroconf を使用してローカル ネットワーク上で公開されます。

最初に、サービス タイプとして使用してサービスを公開し_http._tcp.ましたが、NAS と音楽レシーバー (!) の両方が、その正確なサービス タイプで自分自身をブロードキャストしていることがすぐにわかりました。

そのため、私のサービスと HTTP を使用している他のサービスをどのように区別するかという問題が生じます。

代替案

別のサービス タイプを使用する

これは間違いなく最も簡単な方法であり、(ほぼ) 他のサービスが使用されないことを保証します。

ただし、Apple 1によると、新しいサービスはIANA に登録する必要があります。これは明らかに必須ではありませんが、彼らが推奨しているように見ると、それを行う方法が間違っているように感じます

TXT レコードの使用

Apple 2では、TXT レコードを次のように説明しています。

サービスが登録されると、サービス (SRV) レコード、ポインター (PTR) レコード、およびテキスト (TXT) レコードの 3 つの関連する DNS レコードが作成されます。TXT レコードには、サービスを解決または使用するために必要な追加データが含まれていますが、多くの場合空でもあります。

確かにそれが正しい方法である可能性があるように感じますが、まだ確信が持てず、フィールドに何を含める必要があるかの説明を見つけるのは困難です.

<service_name>-<version>私の最初のことは、それが実際にどのサービスであるかを確認するために解析されるようなものを置くことです。

私の NAS は、モデル番号とバージョン番号を識別するためにこれを使用しているようです。

サービスに話しかけてみてください

サービスを見つけたら、常にHEAD既知のエンドポイントでリクエストを実行し、サービスによって設定された既知のヘッダーを探すことができます。

HEADこれはかなり遅いアプローチのように感じられ、受信者にリクエストを送信するとどうなるかは誰にもわかりません。


明確にするために、この質問は特定の言語やフレームワークとは関係なく、zeroconf の概念に関するものです。

いくつかのコードを表示できますが、それがどのように役立つかわかりません。

4

1 に答える 1

1

まず、宣伝しているサービスは実際にRFC 2782_httpで定義されている資格を満たしていますか。具体的には、トランスポートに HTTP を使用するだけでなく、次のことも行います。

  • 「一般的な」Web ブラウザ クライアント ソフトウェアで表示できます。
  • 主に人間のユーザーによって表示されることを意図しています。

いいえの場合は、独自のサービス タイプを登録します (HTTP をトランスポートとして使用するが、これらの条件を満たさない他のサービスがいくつかあります。そのため-http、サービス名の末尾に , , を参照してpgpkey-httpくださいsenteo-http) xul-http

はいの場合、RFC の解釈がどれほど厳密であるかに応じて、いくつかの方法があります。質問ですでに述べたように、最も厳密でないのは、TXTレコードを追加することだけです。iTunes はTXTレコードを次の形式で登録しますiTSh Version=196618

もう少し厳格に感じている場合、RFC では、HTTP のu=p=およびpath=TXT レコードが存在することのみが明示的に述べられています。おそらく誰かがこれに賛同するかもしれませんが、既存のエントリに TXT レコードを追加することが嫌われているかどうかについての議論はあまり見たことがありません。したがって、もう 1 つの方法は、アルゴリズムのインスタンス名だけを使用することです。たとえば、サフィックス「-NicklasAService」をデバイス名に追加します。うまくいけば、ローカルネットワークに一意の名前を付けますが、サフィックスを探すだけで PTR レコードによってサービスを簡単に選択できるようにします。

于 2014-01-13T19:37:12.990 に答える