Restaurante La Strada

getifaddrs 예제

Posted on

즉, 모든 매우 바보, 그리고 리눅스에서 밝혀로 인터페이스에 대한 정보를 검색하기위한 훨씬 더 나은 API가있다 : getifaddr (). 호출은 메모리 할당을 처리하므로 메모리를 해제하기 위해 freeifaddrs()를 호출해야 하지만 충분한 크기의 버퍼를 전달할 필요가 없습니다. getifaddrs는 커널의 각 프로토콜 패밀리가 인터페이스에 대한 정보를 내보낼 수 있도록 합니다. 호출자는 반환된 각 인터페이스의 주소 패밀리를 확인하여 해석하는 방법을 알아야 합니다. 예를 들어 AF_INET/AF_INET6에는 인터페이스 주소가 포함되며 AF_패킷에는 통계가 있습니다. 이 세 패밀리에 대한 예제 코드는 여기에 나와 있습니다. 아래 프로그램은 getifaddrs(), freeifaddrs(), 및 getnameinfo(3)의 사용을 보여줍니다. 다음은 한 시스템에서이 프로그램을 실행할 때 볼 수 있습니다 : getifaddrs () 함수는 glibc 2.3에 처음 나타났지만 glibc 2.3.3 이전에 구현은 IPv4 주소만 지원했습니다. IPv6 지원은 glibc 2.3.3에 추가되었습니다. IPv4 이외의 주소 패밀리 지원은 netlink를 지원하는 커널에서만 사용할 수 있습니다.

좋은 예입니다. 예제에 라이선스 헤더를 추가할 수 있습니까? getifaddrs()에 의해 반환되는 데이터는 동적으로 할당되며 더 이상 필요하지 않은 경우 freeifaddrs()를 사용하여 해제되어야 합니다. getifaddrs() 함수는 ifap에서 참조하는 메모리에 로컬 컴퓨터에 연결된 네트워크 인터페이스 목록에 대한 참조를 저장합니다. getifaddrs() 함수는 로컬 시스템의 네트워크 인터페이스를 설명하는 연결된 구조 목록을 만들고 목록의 첫 번째 항목의 주소를 *ifap에 저장합니다. 이 목록은 다음과 같이 정의된 ifaddrs 구조로 구성됩니다: getifaddrs() 함수는 ioctl(), malloc(), 소켓(), 및 sysctl()에 의해 지정된 오류에 대해 실패하고 errno를 설정할 수 있습니다. 이봐,이 일이 좋은, 인터페이스가 무선 대신 이더넷인지 확인하는 방법이 있습니까? Linux에서 반환되는 주소는 일반적으로 인터페이스에 할당된 IPv4 및 IPv6 주소일 뿐만 아니라 인터페이스및 물리적 계층에 대한 하위 수준 세부 정보를 포함하는 인터페이스당 하나의 AF_패킷 주소입니다. 이 경우 ifa_data 필드에는 (Linux 2.4 이상, struct net_device_stats, )에 정의된 구조형 rtnl_link_stats에 대한 포인터가 포함될 수 있으며, 여기에는 다양한 인터페이스 속성및 통계가 포함되어 있습니다.