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에 있다고 가정하면 Open 및 Parse/Proc/Net/Arp. 형식은 ARP 명령의 출력과 유사합니다. ARP 테이블에 넣으려면 최소한 한 번은 문제의 IP에 패킷을 보내야하며, 물론 로컬 세그먼트 외부에서는 아무것도 얻지 못할 것입니다.
이 캐시에 IP를 얻는 것만으로는 쉽습니다. 예를 들어 미사용 포트에서 UDP 패킷을 보내기 만하면 표시됩니다.
또 다른 대안은 원시 소켓을 사용하여 자신의 ARP 패킷을 제작하고 보내는 것이지만 훨씬 더 복잡합니다 :)이 경로를 내려 가고 싶다면 소스 코드를 연구하십시오. arping (오늘 페이지가 다운되었지만 git repo LibpCap과 같은 플랫폼 독립적 인 라이브러리를 사용하여 좀 더 휴대 할 수 있습니다.
다른 팁
나는 조금 걱정한다
외국 호스트의 MAC 주소를 검색하십시오
귀하의 질문의 일부.
동일한 네트워크의 기계에 대한 ARP 테이블에서만 항목을 얻는다는 것을 알고 있기를 바랍니다. 라우터를 통해 기계에 연결하면 ARP 테이블에 라우터 MAC 주소 만 표시됩니다. 따라서 알 수있는 방법이 없습니다 외국 호스트의 MAC 주소 동일한 네트워크의 호스트가 아니라면 (라우터가 관련이 없음).
따라서 대답은 라우터를 통해 도달하는 호스트가 불가능하고 로컬 네트워크에서 호스트가 도달 할 수있는 경우 ARP 명령의 출력조차 플랫폼마다 다를 수 있으므로 플랫폼 특정 액세스 방법 만 사용할 수 있습니다.