문제:
Linux의 IP 주소 확인 특히 여러 잠재적인 공용 IP 주소를 대상으로 C를 사용하여 프로그래밍 방식으로 기계를 사용합니다.
해결책:
getifaddrs() 함수는 Linux 및 POSIX에서 IP 주소를 검색하는 보다 안정적인 방법을 제공합니다. 호환 운영 체제. 이는 각각 네트워크 인터페이스 및 관련 주소를 나타내는 ifaddrs 구조의 연결된 목록을 반환합니다. 다음은 사용법을 보여주는 코드 예제입니다.
#include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> int main (int argc, const char * argv[]) { struct ifaddrs * ifAddrStruct=NULL; struct ifaddrs * ifa=NULL; void * tmpAddrPtr=NULL; getifaddrs(&ifAddrStruct); for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) { continue; } if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4 // is a valid IP4 Address tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6 // is a valid IP6 Address tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } } if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct); return 0; }
코드에서 getifaddrs()는 ifAddrStruct 연결 목록을 네트워크 인터페이스 정보로 채웁니다. 각 ifaddrs 구조에는 IP 주소를 나타내는 소켓 주소 구조에 대한 포인터인 ifa_addr 멤버가 포함되어 있습니다. AF_INET은 IPv4 주소용이고 AF_INET6은 IPv6 주소용입니다.
코드는 연결된 목록을 반복하고 ifa_addr이 유효한지 확인한 다음 IP 주소 문자열을 인간 문자열로 변환하여 검색하고 인쇄합니다. inet_ntop()을 사용하여 읽을 수 있는 형식입니다.
공용 IP 주소를 식별하려면 네트워크 인터페이스 이름(예: "eth0") 또는 IP 주소를 비교하여 어느 주소가 외부 네트워크와 일치하는지 확인하세요.
위 내용은 C에서 Linux 시스템의 IP 주소를 프로그래밍 방식으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!