2011-11-27 5 views
2

MAC 주소를 찾으려고 노력 중이고 Linux에서 sysctl을 사용하여 작업 솔루션을 만들 수있었습니다. 문제는이 솔루션이 내가 개발중인 FreeBSD 버전에서 작동하지 않는다는 것입니다. sysctl을 사용하는 것 외에도 C에서 MAC 주소를 찾을 수있는 방법이 있습니까?C에서 리눅스와 FreeBSD의 MAC 주소 알아 내기

답변

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 : blaze는 getifaddrs(3)을 가리키며, 약간의주의 사항, 비 -posix 기능을 지적했습니다. glibc 리눅스가 지원하지만 문서가 아닌 bsd 기능인가? 거의 문서화되지 않은 사람 페이지는

모든 문서 :-)있는 기능과 kernel.org에서 수동로부터 :

되지 않음을 POSIX.1-2001에. 이 함수는 BSDi에서 처음 나타 났으며 은 BSD 시스템 인 에 있지만 약간 다른 의미가 기록되어 있습니다. 주소 당이 아닌 인터페이스 당 하나의 항목을 반환합니다 ( ). 즉, 인터페이스에 주소가없는 경우 ifa_addr 및 기타 필드가 실제로 NULL이 될 수 있으며 인터페이스에 IP 주소가 할당되어 있으면 링크 레벨 주소가 반환되지 않습니다. 또한 ifa_broadaddr 또는 ifa_dstaddr 중 하나를 선택하는 방법은 다양한 시스템에서 다릅니다. 인터페이스에 대한 낮은 수준의 세부 사항을

주소가 일반적으로 인터페이스에 할당 된 IPv4 및 IPv6 주소 될 것입니다 리눅스에 반환뿐만 아니라 인터페이스 당 하나 개의 AF_PACKET 주소를 포함하고 그것의 물리 계층. 이 경우 ifa_data 필드에는 다양한 인터페이스 속성 및 통계가 포함 된 net_device_stats 구조체에 대한 포인터가 포함될 수 있습니다.

그래서 동작이 달라질 수 있으며 어쨌든 #ifndef을 컴파일해야 할 수 있습니다.

http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html의 kernel.org 설명서 페이지에는 유용한 예제 코드가 들어 있습니다.로컬 Linux man 페이지는 위의 링크와 비교하여 다소 가난합니다.

나는 아직도 다른 사람이 모든 이식성 작업을하고 당신이 그것을 사용함으로써 얻을 수있는 모든 추가 기능을했기 때문에 libpcap이 더 이식성 있다고 생각한다.

희망이 도움이됩니다.

+0

libpcap을 사용하여 자신의 mac 주소를 찾을 수 있다는 사실을 알지 못했습니다. 내 맥을 구할 수있는 몇 가지 기능을 가르쳐 주시겠습니까? – Blackie123

+1

@ Blackie123 : 답변을 업데이트했습니다. 예제를 포함합니다. – RedComet

+0

나를 위해 너무 많은 문제가있는 것처럼 보입니다. getifaddrs (3)가 아닌 이유는 무엇입니까? – blaze

1

getifaddrs (3)는 로컬 인터페이스의 IP 주소와 MAC 주소를 반환합니다. Linux와 FreeBSD 사이의 포터블

관련 문제