次の方法で共有


サービスの検出を実行する

重要

これは 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 アドレスへの接続が試行されます。 ただし、アプリケーションでの許可されているアドレスの検索中は、これによって遅延が発生する可能性があります。