最初に、Bonjourは正確に何をしますか(以下の私の推測を読んでください)?
ここ Bonjourを使用すると、IPネットワーク上のコンピュータ、デバイス、およびサービスを自動検出できることがわかりました。しかし、「IPネットワーク上のデバイスを検出する」だけでなく、Bonjourが実行されているデバイスにIPアドレスを割り当てることによってIPネットワークを作成することもできると思いました。 そうですか?
そして、私はまだ本質を逃しています。次のように機能しますか?まず、デバイス(ラップトップなど)を物理的に接続して、デバイスが相互に通信できるようにします。次に、一部のラップトップでBonjourを実行しているとしましょう。その結果、これらのラップトップは自動的にIPアドレスを自分に割り当てます。したがって、ラップトップ(Bonjourが実行されている場所)はIPネットワークを構築します。 それはこのように機能しますか?
または、Bonjourを実行しているコンピュータがサービスと見なされておらず、Bonjourがこのコンピュータで実行されているという理由だけでは、ブロードキャストしない。つまり、コンピューターで実行されているアプリケーションは、Bonjourを使用してそれらをブロードキャストする必要があります。したがって、自分自身をブロードキャストするのは(コンピュータではなく)アプリケーションであり、自動的には行われません(アプリケーションは自分自身を明示的にブロードキャストする必要があります)。 それでよろしいですか?
私のアプリケーションはどれだけ正確にそれ自体をブロードキャストできますか?コマンドラインを使用してサービスを登録できますか(Bonjourを使用するすべてのアプリケーションが新しいサービスが出現したことを認識できるようにするため)?
また、Bonjourで作成したIPネットワークを利用したアプリケーションが欲しいです。そのため、私のアプリケーションは、ネットワークに存在するデバイス/サービスを知る必要があります。さらに詳しく言えば、私のアプリケーションにはサービスのリストが必要です。リスト内の各サービスには、名前、サービスが実行されているIPアドレス、およびアプリケーションが使用するポートが必要です。 Bonjourはこの情報を何らかの方法で提供できますか?その場合、正確にどのように機能するか。私のプログラムはどのようにしてBonjourからこの情報を取得できますか?私のプログラムは、Bonjourによって作成され、上記の情報を含むファイルを読み取ることができますか?コマンドラインでいくつかのコマンドを使用して、この情報を取得できますか?
ファイル、環境変数、またはコマンドラインのコマンドからサービスに関する情報にアクセスすることに特別な関心があります。これらのオプションは私には最も簡単なようです!これらのケースでは、特定のプログラミング言語からBonjourと通信するために追加のライブラリを使用する必要がないためです。
追伸私の質問で何かが明確でない場合は、喜んで質問してください。私は私の質問をより明確な方法で定式化しようとします。
P.P.S. Windows 7を使用しています。
追加:アプリケーションをPHPで作成する予定です。すべてのコンピューターでApache Webサーバーを実行する必要があります。また、Bonjourを使用して、コンピューターがお互いを検出できるようにしたいと考えています(コンピューターはローカルネットワークで動作しています)。
はい。 IETF ZeroConfワーキンググループの共同議長を務め、Zero Configuration Networkingに関するO'Reillyの本を執筆したAppleのRendezvous/Bonjourの主なメンテナーであるStuart Cheshireは、Bonjourを「3つの脚のあるスツール」。
IETF ZeroConfワーキンググループとAppleはどちらも、リンクローカルアドレッシング、特にIPv4リンクローカルアドレッシング(169.254.0.0/16
アドレス)をZeroConf/Bonjourの一部と見なしています。 「便の脚」。
WindowsはすでにAppleのBonjour for Windowsソフトウェアがインストールされていなくても自動リンクローカルアドレス指定をサポートしているため、多くのWindowsユーザーはIPv4リンクローカルアドレス指定がBonjour/ZeroConfの一部であるとは考えていません。
はい。 MacおよびWindowsマシンは、デフォルトでIPv4リンクローカルアドレッシングを実行します。これらはDHCP用に構成されていますが、利用可能なDHCPサーバーがない場合です。 Avahi(またはおそらく他のZeroConf実装)がインストールされたLinuxおよびBSDマシンもこれを行います。
コンピューターがBonjourを実行している場合、そのホスト名はmDNS経由でLANに公開されます。マシンの名前が「Alice」の場合、mDNS経由のAlice.local
になります。同じLAN(具体的には、同じリンクローカルマルチキャストドメイン)上の別のコンピューター(「Bob」と呼びましょう)からは、単にping Alice.local
と入力でき、ボブはAlice.local
のmDNSルックアップを実行して、アリスのIPを検出する必要がありますアドレス、およびそれが取得したアドレス(の1つ)に対してpingを実行します。
ただし、Bonjourはホスト名とサービス名を区別することに注意してください。たとえば、2つの別々のUSBプリンターがあり、たとえば「HP」と「Canon」がAliceに接続されていて、Aliceが両方のlpr
プリントサーバーとして機能している場合、それぞれが独自のサービスとして表示され、ホストとしてAlice.local
にマップされます。
それらのサービス名は、アリスについて言及せずに、「HP」および「Canon」としてユーザーに表示されます。舞台裏では、それらはHP._printer._tcp.local
およびCanon._printer._tcp.local
として知られており、これらのサービス名のDNS-SDルックアップは、これらのサービスが2つの異なるTCPポートのAlice.local
で使用できることを示します。
つまり、アプリケーションはBonjourデーモン(Appleの実装ではmDNSResponder
と呼ばれます)に、宣伝したいサービスがあることを通知する必要があります。 macOSには、本来Bonjourに対応していないレガシーサービスのサービスアドバタイズを自動的に処理するメカニズムがあります。たとえば、macOSのsshd
はOpenSSHであり、Bonjourを直接サポートしていませんが、macOSがBonjourを介してssh
サービスをアドバタイズするため、LAN上の他のマシンからssh [email protected]
を実行できます。
MacOSには、次の構文を使用してサービスを登録できる「dns-sd」コマンドラインツールがあります。
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]
# (Register a service)
だから例えば:
dns-sd -R MyWebsite _http._tcp local 80
Bonjour for WindowsやBonjour SDK for Windowsに含まれていたり、Appleの mDNSResponder オープンソースプロジェクトからWindows用にコンパイルできたりしても、驚かないでしょう。 dns-sd.exe
をグーグルで検索すると、そのようなものが存在することがわかります。バイナリをダウンロードするだけだとは思いません。代わりに、上記のパッケージの1つから取得するか、mDNSResponderプロジェクトソースから自分でコンパイルしようとします。
dns-sd
コマンドラインツールを使用してサービスを参照し、検索することもできます。ローカルWebサービスを検索する例を次に示します。
-B
を使用してローカルWebサービスを参照します。
$ dns-sd -B _http._tcp local
Browsing for _http._tcp.local
Timestamp A/R Flags if Domain Service Type Instance Name
16:30:59.870 Add 3 6 local. _http._tcp. My Cool Web App
16:30:59.871 Add 3 6 local. _http._tcp. Someone Else's Web Service
16:30:59.871 Add 3 6 local. _http._tcp. A Third One
^C
-L
を使用して、必要なもの「My Cool Web App」を検索します。
$ dns-sd -L "My Cool Web App" _http._tcp local
Lookup My Cool Web App._http._tcp.local
16:31:52.678 My\032Cool\032Web\032App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)
^C
-Q
を使用して、MyWebServer.localのIPアドレスをクエリします。
$ dns-sd -Q MyWebServer.local
Timestamp A/R Flags if Name T C Rdata
16:32:40.786 Add 2 6 MyWebServer.local. 1 1 169.254.45.209
^C
これらの例では、Ctrl-C
ツールからdns-sd
を除外する必要があることに注意してください。それ以外の場合は、いつまでも開いたままで、ネットワークを継続的に監視し、発行したクエリの結果の変化を報告します(-B
ブラウズクエリを開いたまま、ネットワーク上で送受信されるWebサーバーなど)。これやその他の理由により、dns-sd
ツールはスクリプトからの呼び出しにはあまり適していません。結局のところ、希望する言語のZeroConfライブラリを確認したい場合があります。
他の質問の1つに答えるために、ファイルの読み取り/書き込みだけでクエリを実行して結果を取得できるZeroConf実装については知りません。 Bonjourを使用するほとんどのアプリは、直接(C/C++/Obj-C/Swiftアプリ)、または言語に固有のライブラリー(解釈済み/スクリプト言語)を介して、APIを呼び出すことでこれを行います。
最初に、Bonjourは正確に何をしますか(以下に書かれた私の推測を読んでください)?ここで私は、BonjourがIPネットワーク上のコンピューター、デバイス、およびサービスの自動検出を可能にすることを発見しました。しかし、「IPネットワーク上のデバイスを検出する」だけでなく、Bonjourが実行されているデバイスにIPアドレスを割り当てることによってIPネットワークを作成することもできると思いました。私は正しいですか?
結構です。 Jonが指摘したように、IPアドレスの割り当てにはDHCP(通常)が使用されます。通常のDNSがドメイン名をIPアドレスに変換するのと同じように、Bonjourは一時的なドメイン名(ローカルネットワーク内)を提供するIPアドレスに変換するために使用されます。
そして、私はまだ本質を逃しています。次のように機能しますか?まず、デバイス(ラップトップなど)を物理的に接続して、デバイスが相互に通信できるようにします。次に、一部のラップトップでBonjourを実行しているとしましょう。その結果、これらのラップトップは自動的にIPアドレスを自分に割り当てます。したがって、ラップトップ(Bonjourが実行されている場所)はIPネットワークを構築します。このように機能しますか?
いいえ。ほとんどの場合、ラップトップはローカルDHCPサーバーからIPアドレスを取得しています。 Bonjourは、各サービスが他のユーザーに提供できるサービスを理解するのに役立ちます。
または、Bonjourを実行しているコンピュータがサービスと見なされておらず、Bonjourがこのコンピュータで実行されているという理由だけでは、ブロードキャストしない。つまり、コンピューターで実行されているアプリケーションは、Bonjourを使用してそれらをブロードキャストする必要があります。したがって、自分自身をブロードキャストするのは(コンピュータではなく)アプリケーションであり、自動的には行われません(アプリケーションは自分自身を明示的にブロードキャストする必要があります)。正しいですか?
はい。通常、アプリケーションはその存在を明示的に通知する必要があります。これは多くの場合、システムが提供するライブラリ(OS Xでは一般的)またはカスタムライブラリ(PerlのNet :: Bonjourなど)を使用して実行できます。
アプリケーションはどの程度正確にブロードキャストできますか?コマンドラインを使用してサービスを登録できますか(Bonjourを使用するすべてのアプリケーションが新しいサービスが出現したことを認識できるようにするため)
これを行うコマンドラインツールについては知りませんが、多くの主要なプログラミング言語では、これを行うために利用できるライブラリがあります。
また、Bonjourで作成したIPネットワークを利用したアプリケーションが欲しいです。そのため、私のアプリケーションは、ネットワークに存在するデバイス/サービスを知る必要があります。さらに詳しく言えば、私のアプリケーションにはサービスのリストが必要です。リスト内の各サービスには、名前、サービスが実行されているIPアドレス、およびアプリケーションが使用するポートが必要です。 Bonjourはこの情報を何らかの方法で提供できますか?
Bonjourライブラリのほとんどは、これを行うことができるはずです。 http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm の最初の例を参照してください
その場合は、正確にどのように機能するか。私のプログラムはどのようにしてBonjourからこの情報を取得できますか?私のプログラムは、Bonjourによって作成され、上記の情報を含むファイルを読み取ることができますか?コマンドラインでいくつかのコマンドを使用して、この情報を取得できますか?
プログラムは適切なライブラリを使用して、Bonjourプロトコルを使用して、ローカルネットワーク内の他のすべてのコンピューターに、利用可能なサービスを通知するように依頼します。そのライブラリーは、応答を解析し、より有用な形式でそれらをユーザーに提示します。
ファイル、環境変数、またはコマンドラインのコマンドからサービスに関する情報にアクセスすることに特別な関心があります。これらのオプションは私には最も簡単なようです!これらのケースでは、特定のプログラミング言語からBonjourと通信するために追加のライブラリを使用する必要がないためです。
これを行うツールは知りませんが、存在する可能性があります。
追伸私の質問で何かが明確でない場合は、喜んで質問してください。私は私の質問をより明確な方法で定式化しようとします。
あなたが書いているプログラムが何をするか、そしてあなたがそれを書いている言語についてのいくつかのより多くの情報は、助けを容易にするでしょう。
導入情報の詳細については、次の両方を試してください。