サービスの検出を実行する
重要
これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、Azure Sphere (統合) のドキュメントを表示します。
Azure Sphere 上の高度なアプリケーションでは、DNS サービス検出 (DNS-SD) を使用してサービス検出を実行できます。 アプリケーションはサービス検出を使用して、ネットワーク サービスを検出しホスト名解決を実行できるため、Azure Sphere ファイアウォールを介してサービスと対話できます。 マルチキャスト DNS (mDNS) を使用して、ローカル ネットワーク上でピア ツー ピア検出を実行することもできます。これは、接続先のエンドポイントの IP アドレスとホスト名が設計時に分からない場合に特に便利です。
アプリケーションは、DNS-SD クエリを使用して、ローカルでない DNS サーバーから、またはマルチキャスト リンクを介して DNS レコードを取得します。 クエリされている名前が .local トップレベル ドメイン (TLD) 下にある場合、クエリはすべての有効化されたネットワーク インターフェイスを通じたローカル ネットワーク上でマルチキャストです。それ以外の場合は、ユニキャスト サービス検出が実行されます。 サービス検出のサンプルは、Azure Sphere 上でサービスの検出を実行する方法を示しています。
Note
Azure Sphere ファイアウォールでは、アプリケーションと承認されていないサービスとの通信が遮断されます。 ただし、アプリケーション マニフェストで .local TLD への送信接続を許可すると、アプリケーションのローカル ネットワーク上で宣伝されている承認されていないサービスとの接続が許可されることで、デバイスのセキュリティ リスクが増す場合があります。 アプリケーションでは、広告サービスから承認されていないパーティを遮断する安全な環境で .local TLD への送信接続のみを許可してください。 このシナリオで保護をさらに追加するには、Azure Sphere では、ローカル ネットワークで検出されたサービスはローカル サブネットにも存在する必要があります。
ヘッダー ファイルをインクルードする
サービス検出を実行するアプリケーションには resolv ヘッダー ファイルをインクルードする必要があります。
#include <resolv.h>
サービス接続を許可する
DNS-SD クエリを実行する前に、アプリケーション マニフェストの AllowedConnections 機能にサービスを追加する必要があります。 これで、Azure Sphere ファイアウォールによって、アプリケーションから関連付けられたホスト名と IP アドレスを使用して検出されたサービス インスタンスに接続できるようになります。 .local TLD サービスが指定されている場合、ファイアウォールではローカル サブネット上で検出されたリソースへの接続のみが許可されます。
AllowedConnections 機能では、次の種類のサービス名がサポートされます。
- ローカル DNS サービス名 (_sample._tcp.local など)
- ローカルでない DNS サービス名 (_sampleinstance._tcp.dns-sd.org など)
- "_sampleinstance._tcp.hostname.local" などのローカル サービス インスタンス名
- ドメイン名 (samplehost.contoso.com など)
- IP アドレス (IP address)
ローカル以外のサービス名を含むアプリケーション マニフェストからの抜粋を次に示します。
"AllowedConnections": [ "_http._tcp.dns-sd.org" ]
DNS-SD クエリを実行する
DNS-SD クエリを実行するには、いくつかの種類の DNS レコードを要求する必要があります。
- DNS サービスのインスタンスを列挙する PTR レコード。
- ホスト名やポートなどのサービス インスタンスの詳細を含む SRV および TXT レコード。
- 取得されたホスト名の IP アドレスを含む A レコード。
クエリは、送信する前に、作成し、初期化してから、DNS レコードを要求するクエリ メッセージを追加する必要があります。 DNS-SD クエリを作成して初期化するには、POSIX 関数 res_init () を呼び出します。 クエリのメッセージを作成するには、POSIX 関数 res_mkquery() を呼び出します。
ユニキャスト DNS クエリの送信
ユニキャスト サービス検出を実行するときに、POSIX 関数 res_send() を呼び出して、DNS-SD クエリを送信し、応答を取得することができます。
マルチキャスト リンクを介してクエリを送信する
マルチキャスト リンクを介して DNS-SD クエリを送信するには、アプリケーションでソケットを開き、そのソケットを介して要求をループバック IP アドレス 127.0.0.1 (接続先ポート 53) に送信する必要があります。 要求が送信されると、複数の応答が返される場合があります。 アプリケーションは待機し、すべての応答を収集するのに数秒間をリッスンします。 これについては、サービス検出のサンプルを参照してください。
重要
このループバック IP アドレスはベータ機能であり、今後のリリースで廃止され、置き換えられます。 これは、アドレスに依存しているアプリケーションにとっては破壊的変更です。
複数の IP アドレスを持つホストに許可される接続
Azure Sphere ファイアウォールでは、ホスト名ごとに 1 つの IP アドレスへの接続のみが許可されます。 ホストに複数の IP アドレスがある場合、Azure Sphere ファイアウォールではいずれかのアドレスへの接続のみが許可されます。 アプリケーションでは、curl を使用して、複数の IP アドレスを持つホストに HTTPS 要求を送信できます。許可されているアドレスが見つかるまで、curl によって各 IP アドレスへの接続が試行されます。 ただし、アプリケーションでの許可されているアドレスの検索中は、これによって遅延が発生する可能性があります。