4

現在、コマンド ラインからの 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 を使用しています。

4

2 に答える 2

2

~について少し心配している

外部ホストの MAC アドレスを取得する

あなたの質問の一部。

同じネットワーク上のマシンの ARP テーブルにのみエントリを取得することを認識していただければ幸いです。ルーター経由でマシンに接続する場合、ARP テーブルにはルーターの MAC アドレスしか表示されません。そのため、同じネットワーク上のホストでない限り (ルーターが関与していない場合) 、外部ホストの MAC アドレスを知る方法はありません。

その答えは、ルーター経由でホストに到達することは不可能であり、ホストがローカル ネットワーク上で到達可能な場合、arp コマンドの出力でさえプラットフォーム間で異なる可能性があるため、プラットフォーム固有のアクセス方法のみを使用できるということです。

于 2009-05-07T00:09:12.240 に答える
2

一般的に、これは OS によって異なります。これには実際の標準 API はありません。

Linux を使用していると仮定して、/proc/net/arp を開いて解析します。形式は、arp コマンドからの出力の形式に似ています。問題の IP を ARP テーブルに入れるには、問題の IP に少なくとも 1 回はパケットを送信する必要があることに注意してください。もちろん、ローカル セグメントの外では何も取得できません。

このキャッシュに IP を取得するのは簡単です。たとえば、未使用のポートに UDP パケットを送信し、表示されるまでポーリングするだけです。

もう 1 つの方法は、生のソケットを使用して独自の arp パケットを作成して送信することですが、それははるかに複雑です :) このルートをたどりたい場合は、arpingのソース コードを調べてください (ページは今日ダウンしていますが、gitリポジトリはオンラインです)、libpcap のようなプラットフォームに依存しないライブラリを使用することで、移植性が少し向上する可能性があります (ただし、ルートが必要です)。

于 2009-05-06T23:39:41.343 に答える