問題タブ [zeroconf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1385 参照

bonjour - マルチスレッドの avahi 解決で segfault が発生する

zeronconf 対応の C/C++ アプリを Linux に移植しようとしていますが、D-BUS 関連の segfault が発生します。これが Avahi のバグなのか、Avahi の誤用なのか、コードのバグなのかはわかりません。

AvahiClient、AvahiSimplePoll、および AvahiServiceResolver をカプセル化する ZeroconfResolver オブジェクトを使用しています。ZeroconfResolver には、最初に AvahiSimplePoll、次に AvahiClient、最後に AvahiServiceResolver をインスタンス化する Resolve 関数があります。インスタンス化のたびに、次の処理に進む前にエラーをチェックしています。AvahiServiceResolver が正常に作成された後、AvahiSimplePoll で avahi_simple_poll_loop を呼び出します。

このプロセス全体は、同期的に実行するとうまく機能しますが、複数の ZeroconfResolver が非同期で同時に使用されている場合 (つまり、複数のスレッドが独自の ZeroconfResolver オブジェクトを作成している場合)、segfaults で失敗します。segfault を再現するオブジェクトの簡単な適応は、以下のコードで見ることができます (すぐに segfault を生成しないかもしれませんが、私の使用例では頻繁に発生します)。

「すぐに使用できる」Avahi はスレッド セーフではないことは理解していますが、[1] の私の解釈によると、同じプロセスに複数の AvahiClient/AvahiPoll オブジェクトを配置しても、2 つ以上から「アクセス」されない限り安全です。 1 つのスレッド。各 ZeroconfResolver には、スレッド境界を越えて相互に作用しない独自の Avahi オブジェクトのセットがあります。

セグメンテーション違反は、Avahi ライブラリ内の一見ランダムな関数で発生します。一般に、これらは dbus を参照する avahi_client_new または avahi_service_resolver_new 関数内で発生します。Avahi wiki は、AvahiClient/AvahiPoll オブジェクトの「作成」もスレッドセーフではないことを暗示しているのでしょうか?

[1] http://avahi.org/wiki/RunningAvahiClientAsThread

0 投票する
1 に答える
1585 参照

c++ - MFC を使用する Windows 上の DNS-SD

Bonjour/Zeroconf サービス検出を追加する必要がある MFC を使用して構築されたアプリケーションがあります。最善の方法を見つけるのに少し苦労しましたが、mDNSresponder ソース コードで提供されている DLL スタブを使用し、それによって生成された静的ライブラリにアプリケーションをリンクすることにしました (これは、システムを使用します)。 dnssd.dll)。

ただし、コールバックが常に呼び出されているとは限らないため、デバイスの検出が停止するため、まだ問題があります。私を混乱させているのは、OSX dns-sd ターミナル サービスを使用する OSX と dns-sd コマンド ライン サービスを使用する Windows では、すべて問題なく動作することです。その上で、クライアント サービスが問題であることを除外し、Windows コードの何が問題なのかを突き止めようとしています。

基本的に DNSBrowseService() を呼び出し、そのコールバックで DNSServiceResolve() を呼び出し、最後に DNSServiceGetAddrInfo() を呼び出してデバイスの IP アドレスを取得し、接続できるようにします。

これらの呼び出しはすべて、次のような WSAAsyncSelect の使用に基づいています。

ただし、サービスが存在するにもかかわらずコールバックが呼び出されない場合があり、コマンドラインを使用してそれを確認できます。

これが 100% 信頼できない理由については完全に困惑していますが、それはコマンド ラインから同じ DLL を使用した場合です。考えられる唯一の説明は、WSAAsyncSelect がソケットの処理メッセージを登録する前に、DNSServiceResolve 関数がコールバック関数を呼び出そうとすることですが、これを回避する方法がわかりません。

私はこれに何年も費やしてきましたが、今では完全にアイデアがありません。「それは本当にばかげた方法です。なぜX、Y、Zをやらないのですか」という提案であっても、どんな提案でも大歓迎です。

0 投票する
1 に答える
2054 参照

zeroconf - Bonjour for Windows の代替案

Windows 用の ZeroConf アプリケーションの実装を検討しています。Bonjour と Mono.Zeroconf に気付きましたが、適切な代替手段があるかどうか疑問に思っていましたか?

0 投票する
1 に答える
826 参照

bonjour - IPを知らなくてもローカルネットワーク上のWebサイトに接続

ローカル ネットワークに接続する組み込みデバイス (RPi に基づく) を作成しています。このデバイスが Web ページを介してデバイスを構成できるようにしたいと考えています (多くのルーターと同じです)。

ユーザーが [http://my-device-config] (またはその他の固定アドレス) を Web ブラウザーに入力すると、デバイスの IP アドレスを知らなくても構成ページに送信されるようになります。

ユーザーが実行する手順は次のとおりです。

  1. ユーザーがデバイスをネットワークに接続するか、デバイスをオンにします。
  2. ユーザーがブラウザに「構成」アドレスを入力すると、構成ページが表示されます。(ネットワーク構成/IP ルックアップなどは必要ありません)

調査によると、Avahi (/Bonjour/Zeroconf) でこれが可能になると思いますが、次の点については不明です。

  1. Avahi はこれを行う最も簡単な方法ですか?
  2. 私のデバイスが Avahi を実行しているローカル ネットワーク上の唯一のデバイスである場合、機能しますか? (つまり、ネットワーク上の他のコンピュータにソフトウェアをインストールする必要はありません)。
  3. プラットフォーム (osx/*nix/windows) で動作しますか?
  4. ブラウザ間で動作しますか?

ヘルプ/洞察をありがとう。

0 投票する
1 に答える
858 参照

timeout - Bonjour タイムアウト

ノートブックのふたを閉じてスリープ状態にすると、ネットワーク内のそのノートブックから登録された bonjour サービスが他のマシンで消えないようです。Bonjour には何らかの方法で設定できるタイムアウトがありますか?

0 投票する
2 に答える
826 参照

windows - Bonjour DNS-SD コールバックが呼び出されません。コードのどこが間違っていますか?

このブログ記事を参考にして、Bonjour の使用方法を学ぼうとしています。

http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/

そのページの下部にリンクされているサンプル プロジェクトをダウンロードしました。魅力的に動作します。現在、コンソール アプリケーションでサービス ディスカバリをゼロから再現しようとしています。

DNSServiceBrowseを返しますkDNSServiceErr_NoErrorが、コールバックは呼び出されません。どうしたの?

0 投票する
4 に答える
1588 参照

macos - マルチキャスト (Bonjour) ホスト名を確認するにはどうすればよいですか?

Bonjour API を使用してレコードを登録しました。今、出版したばかりのレコードの内容を知りたいです。「デーモンのデフォルトを使用する」ことを意味するNULLホスト名を指定して作成しましたが、それが何であるかを照会する簡単な方法が見つかりません!

avahi を使えば簡単です。 を呼び出しavahi_client_get_host_name()て、マシンのホスト名の開始値を取得します。

avahi と Bonjour の両方で、SRV レコードの値は登録の存続期間中に変更される可能性があります。登録が NULL ホスト名で行われた場合、レコードのホスト名は必要に応じて自動的に更新されます。ここで必要なのは、登録時にホスト名の初期値を取得する方法だけです。

私の Snow Leopard テスト マシンでは、デフォルトのマルチキャスト ホスト名がからのマシンの名前と同じではないgethostname(2)ことに注意してください。

私が考えることができる4つの解決策:

  1. 私のプロセスでホスト名を取得します。どこかにあるかもしれません。プロセスのメモリ ダンプを検索したstrings(3)ところ、アドレス空間でマルチキャスト ホスト名の 4 つのインスタンスが見つかりましたが、その名前が他の目的で使用されていることを考えると、これは偶然の一致である可能性があります。探している文字列がプロセスのどこかにあるとしても、それを正常に取得するための API が見つかりません。
  2. デーモンからホスト名を照会します。マッハポートを介して、それをフェッチするデーモンに送信できるクエリがあるかもしれません。API が見つかりません。関連するコードのチャンクは mDNSResponder の uDNS.c ファイルにあり、RPC インターフェイス経由で公開されていないようです。
  3. 登録したサービスを検索できました。ただし、これには多少のネットワーク トラフィックが含まれる可能性があるため、発生しないという保証がない限り、私はそうしたくありません。
  4. uDNS.c のロジックを再実装します。次の組み合わせからマシンのホスト名を取得します。

    • 動的 DNS 構成
    • 静的に構成されたマルチキャスト ホスト名
    • プライマリ インターフェイスの IPv4 アドレスの逆引き
    • gethostname(2)具体的には、または同等のものを使用しません

    そのロジックを再実装することは不可能に思えます。

現時点では、最初の SRV 登録の値を取得するためにルックアップを行う傾向がありますが、理想的ではないようです。正しい解決策は何ですか?

0 投票する
2 に答える
9727 参照

linux - Avahi Hostname Resolution: どこかにキャッシュしていますか?

Fedora 18 と avahi コマンド ライン ツール (バージョン 0.6.31) を使用しています。

開発中のテスト目的で、avahi-resolve-host-name を使用してサブネット上のユニットの IP アドレスを検出します。Wireshark でリクエストとレスポンスを監視します。要求と応答が 1 回成功すると、それ以上の要求は Wireshark に表示されなくなりますが、ツールは引き続き IP アドレスを返します。コンピュータ/avahiデーモン/何かが結果を「キャッシュ」している可能性はありますか?

質問: avahi-resolve-host-name の呼び出しごとにリクエスト パケットを送信したいと考えています。これは可能ですか?

理由: いわば「誤検知」が発生しています。「test1.local」を解決しようとすると、結果の IP が取得されますが、ユニットはこの IP に配置されなくなりました。リクエストを毎回送信して、間違った IP アドレスでユニットが表示されるのを回避できるようにします。