0

前の質問では、サブネット内のすべての有効な IP アドレスを取得しようとしたため、for ループを使用しましたが、試してみたところ、コードがサブネット内のすべての IP アドレスを見つけるのに 2 分以上かかることがわかりました。場合によっては 5 分以上かかることもあります。

私のコードは Mac OS の下で C++ で書いています。

しかし、Windows では、net view/allコマンドを記述するだけで同じことを行うことができ、サブネット内のすべての IP アドレスが瞬時に表示されます。

そしてMAC OSではBonjour service、そのような仕事をするために使用できます。

Net view /allこれらのテクニックは、この速度 (および)のようにどのように機能しBonjour service ますか? この仕事をこのように非常に速く行う方法はありますか? そうでない場合は、Bonjour サービスを Mac OS のコード (C++) に直接使用するための APi があるかどうか教えてください。

編集:

私は新しいアイデアを見つけました

私はAppleでBonjour APIと呼ばれるいくつかのAPIを開発しているのを見つけました。私はそれが助けになるかもしれませんが、Macがopbjectiv-cを使用することを知っているので、それをどのように使用できますか。

ボンジュール

4

2 に答える 2

2

net view /allIP レベルではなく、Windows ネットワーク レベルで動作しています。Windows ネットワークと名前解決が有効になっているマシンのみが一覧表示されます。Windows (または samba) を実行していないコンピューターがある場合、それらは一覧表示されません。プリンターやルーターなども同様です。

IPv4 を使用する最善の方法は、コンピュータの IP アドレスとネットマスクを調べて、現在のサブネット内の IP アドレスのリストを抽出することです。次に、各 IP アドレスに対して ARP ルックアップを強制的に実行します。ARP ルックアップは、ユニットが完全にロックダウンされていても (ポートが開かれておらず、ping に応答していない)、ユニットがネットワーク上に存在する場合は常に機能します。

IPv6 を使用すると、基本的に運が悪くなります。1 つのサブネットで使用可能な IP アドレスの数 (18 446 744 073 709 551 616) は非常に無駄なので、徹底的な検索は不可能です。

于 2012-09-01T08:59:45.023 に答える
1

非同期で作業する必要があります。IcmpSendEcho2のように、通信要求を発行してすぐに返す関数が必要です。呼び出しごとに完了イベントの配列を作成する必要があります。各イベント ハンドルは、1 つの IcmpSendEcho2 呼び出しに渡されます。

その後、WaitForMultipleObjects を呼び出して、すべてのイベントが設定されるのを待ちます。

于 2012-09-01T08:55:08.753 に答える