2011-11-27 20 views
2

我試圖找出MAC地址,我設法在Linux中使用sysctl創建工作解決方案,問題是,這個解決方案不適用於我正在開發的FreeBSD版本。有沒有什麼辦法可以找出C以外的MAC地址,而不是使用sysctl?在Linux和FreeBSD上找到MAC地址C

回答

6

使用libpcap庫。它是您可以找到的最多平臺的方式。

此庫用於網絡嗅探器和入侵檢測,以及專用測量其他網絡統計信息。用於衡量每個進程網絡使用情況的nethogs公用程序,iftop用於衡量每臺機器/端口帶寬的使用情況。在許多角色中非常靈活。

用C語言編寫,但其他語言也有一些包裝。

1http://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函數,但不是文檔。幾乎是一個無證功能:-)

所有文件都手冊頁和手冊在kernel.org:

不在POSIX.1-2001。這個函數首先出現在BSDi中,並且 出現在BSD系統的 上,但是記錄的語義略有不同 - 每個接口返回 一個條目,而不是每個地址。這意味着如果接口沒有地址,ifa_addr和其他 字段實際上可以爲NULL,並且如果接口分配了IP地址,則不會返回鏈路級別的地址 。另外,選擇ifa_broadaddr或ifa_dstaddr的 方法在各種 系統上有所不同。

的地址返回Linux上通常將被分配給接口的IPv4和IPv6 地址 ,還含有每個接口 一個AF_PACKET地址較低級細節有關接口和它的物理層。在 這種情況下,ifa_data字段可能包含一個指向結構的指針net_device_stats,定義在其中,其中包含各種接口屬性和統計信息。

因此,它可能在行爲上有所不同,無論如何您可能需要編輯#ifndef

kernel.org手冊頁在http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html確實提供了示例代碼,這可能會有所幫助。與上面的鏈接相比,我的本地linux手冊頁相當糟糕。

我仍然認爲,如果僅僅因爲別人已經完成了所有可移植性工作以及通過使用它獲得的所有額外功能,libpcap更便於攜帶。

希望這會有所幫助。

+0

我不知道你可以用libpcap找到你自己的mac地址。你能指出我的一些功能,可以幫助我得到我的Mac嗎? – Blackie123

+1

@ Blackie123:更新了答案。包括一個例子。 – RedComet

+0

對我來說看起來太麻煩了。爲什麼不只是getifaddrs(3)? – blaze

1

getifaddrs(3)返回本地接口上的IP地址和MAC地址。在Linux和FreeBSD之間便攜。