3

MAC アドレスを調べようとしていますが、Linux で sysctl を使用して機能するソリューションを作成できました。問題は、このソリューションが開発中の FreeBSD バージョンで機能しないことです。sysctl を使用する以外に、C で MAC アドレスを見つける方法はありますか?

4

2 に答える 2

6

libpcap ライブラリを使用します。その最もマルチ プラットフォームの方法を見つけることができます。

このライブラリは、ネットワーク スニファーや侵入検知に使用されるほか、他のネットワーク統計の測定にも使用されます。プロセスごとのネットワーク使用量を測定する nethogs ユーティリティ、マシン/ポートごとの帯域幅使用量を測定するために使用される iftop。多くの役割で非常に柔軟です。

C で書かれていますが、他の言語用のラッパーがいくつかあります。

1 : http://en.wikipedia.org/wiki/Pcap
[2]: http://www.tcpdump.org
[3]: http://sourceforge.net/projects/libpcap/

編集: これは、詳細なコードと機能を含む完全かつ正確で実用的な例です:
http://coderrr.wordpress.com/2008/03/07/get-the-mac-address-of-a-local-ip/

たくさんのチュートリアルがあり、ソース コードはあなたの親友です。

編集2:ブレイズは、仕事をしているように見えると指摘しましgetifaddrs(3)たが、いくつかの注意点があります。これは非posix関数です。glibc linux がサポートする bsd 関数ですが、文書化されていません。ほとんど文書化されていない機能です:-)

すべてのドキュメントは man ページであり、kernel.org のマニュアルからのものです。

POSIX.1-2001 にはありません。この関数は BSDi で最初に登場し、BSD システムに存在しますが、アドレスごとではなくインターフェイスごとに 1 つのエントリを返すという、わずかに異なるセマンティクスが文書化されています。これは、インターフェイスにアドレスがない場合、ifa_addr およびその他のフィールドが実際には NULL になる可能性があり、インターフェイスに IP アドレスが割り当てられている場合、リンクレベル アドレスが返されないことを意味します。また、ifa_broadaddr または ifa_dstaddr の選択方法は、システムによって異なります。

Linux で返されるアドレスは通常、インターフェイスに割り当てられた IPv4 および IPv6 アドレスですが、インターフェイスとその物理層に関する下位レベルの詳細を含むインターフェイスごとに 1 つの AF_PACKET アドレスもあります。この場合、 ifa_data フィールドには、 で定義された struct net_device_stats へのポインタが含まれる場合があります。これには、さまざまなインターフェイス属性と統計が含まれます。

したがって、動作が異なる可能性があり、#ifndefとにかくコンパイルする必要がある場合があります。

http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.htmlにある kernel.org のマニュアル ページにはサンプル コードが含まれており、参考になるかもしれません。私のローカル Linux のマニュアル ページは、上記のリンクに比べてかなり貧弱です。

libpcap は、他の誰かがすべての移植作業とそれを使用することで得られるすべての追加機能を行ったという理由だけで、より移植性が高いと今でも思います。

お役に立てれば。

于 2011-11-27T19:19:33.453 に答える
2

getifaddrs(3) は、ローカル インターフェイスの IP アドレスと MAC アドレスを返します。Linux と FreeBSD の間で移植可能です。

于 2011-11-28T07:31:28.340 に答える