C ++で外部ホストのMACアドレスを取得する方法
-
06-07-2019 - |
質問
現在、コマンドラインからarpリクエストの出力を解析しています。
string cmd = "arp -n ";
cmd.append(ipaddress);
cmd.append(" | grep ");
cmd.append(ipaddress);
fgets( line, 130, fp);
fgets( line, 130, fp);
ret.append(line);
...
それは機能しますが、ネイティブコマンドラインインターフェイスにそれほど依存しないライブラリ関数を使用してこれを行う方法はありますか?プロジェクトは現在libpcapを使用しています。
解決
一般に、これはOSに依存します。このための実際の標準APIはありません。
Linuxを使用している場合、/ proc / net / arpを開いて解析します。形式は、arpコマンドからの出力の形式に似ています。 ARPテーブルに入れるには、少なくとも最近1回は問題のIPにパケットを送信する必要があります。もちろん、ローカルセグメントの外部にはパケットを取得できません。
このキャッシュにIPを取得するのは簡単です。たとえば、使用されていないポートでUDPパケットを送信するだけで、表示されるまでポーリングします。
別の方法として、生のソケットを使用して独自のarpパケットを作成して送信することもできますが、それははるかに複雑です:)この経路をたどる場合は、 arping (今日はページがダウンしていますが、 git repo はオンラインです)、プラットフォームに依存しないようにすることで、移植性が少し向上する可能性がありますlibpcapのようなライブラリ(ただしルートが必要)
他のヒント
私は少し心配しています
外部ホストのMACアドレスを取得する
質問の一部。
同じネットワーク上のマシンのARPテーブルのエントリのみを取得することを知っていることを望みます。ルーターを介してマシンに接続すると、ルーターのMACアドレスのみがARPテーブルに表示されます。そのため、同じネットワーク上のホスト(ルーターが含まれていない)でない限り、外部ホストのMACアドレスを知る方法はありません。
その答えは、ルーターを介してホストに到達することは不可能であり、ローカルネットワークでホストに到達できる場合、プラットフォーム固有のアクセス方法のみを使用できることです。arpコマンドの出力もプラットフォーム。