高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1333
Duplicate Rendezvous services while browsing


Q:CFNetSevices、NSNetServices、または DNSServiceDiscovery を使用して Rendezvous サービスをブラウズしていると、同じサービス名を含む複数の "Add" イベントが検出されることがあります。なぜこのようなことが起こるのでしょうか?

A:デフォルトでは、Rendezvous はすべてのアクティブなインタフェースをブラウズするため、コンピュータで複数のネットワークインタフェースが使用可能な場合に、このようなことが起こります。したがって、たとえば、コンピュータに Ethernet 接続と AirMac 接続があり、Ethernet と AirMac の両方でサービスをアドバタイズしている場合、同じサービス名を含むコールバックが 2 回呼び出されます。

CFNetServices と NSNetSerivces では、サービスがどのネットワークインタフェースで検出されたかを知る方法がないため、どちらのサービス名も同じサービスを表すと想定するのが一番うまくいきます。たいていはサービスのリストに同じ名前を何度も表示したくないので、各サービス名の参照カウントを管理します。特定のサービス名について "Add" イベントを受け取るたびに参照カウントをインクリメントし、"Remove" イベントの場合は参照カウントをデクリメントします。参照カウントがゼロになったら、ブラウザリストからサービス名を削除します。複数のネットワークインタフェース上で検出されたサービスを Resolve(解決)するときには、Resolve クエリがすべてのネットワークインタフェースに送信されるため、Resolve を開始するのに どのCFNetServiceRef または NSNetService オブジェクトを使用するかは重要ではありません。

/usr/include/dns_sd.h にある新しい DNSServiceDiscovery API では、ブラウズコールバックにより、サービスが検出されたインタフェースに対応するネットワークインタフェース ID が返されます。これを利用して、複数のサービス名に加えて、ネットワークインタフェースを表す追加情報を表示することができます。たとえば、サービス名に "en1" または "AirPort" というテキストを付けて表示したり、AirMac 上でサービスが検出された場合に、サービス名の隣に AirMac アイコンを表示することができます。ただし DNSServiceDiscovery API を使用して異なるインタフェース上のサービスを識別できる場合でも、(上記の参照カウントによる方法で)各サービス名を一度しか表示しないことも、ユーザインタフェースがシンプルになるため、意味があると思われます。


[2004 年 2 月 6 日]