Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mendapatkan semula Alamat IP Mesin Linux secara Pemrograman dalam C?
Masalah:
Tentukan alamat IP Linux mesin secara pengaturcaraan menggunakan C , secara khusus menyasarkan alamat IP awam di kalangan pelbagai potensi alamat.
Penyelesaian:
Fungsi getifaddrs() menyediakan kaedah yang lebih dipercayai untuk mendapatkan semula alamat IP pada Linux dan POSIX -sistem pengendalian yang patuh. Ia mengembalikan senarai terpaut struktur ifaddrs, setiap satu mewakili antara muka rangkaian dan alamat yang berkaitan. Berikut ialah contoh kod yang menunjukkan penggunaannya:
#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; }
Dalam kod, getifaddrs() mengisi senarai terpaut ifAddrStruct dengan maklumat antara muka rangkaian. Setiap struktur ifaddrs mengandungi ahli ifa_addr, yang merupakan penunjuk kepada struktur alamat soket yang mewakili alamat IP. AF_INET adalah untuk alamat IPv4, dan AF_INET6 adalah untuk alamat IPv6.
Kod ini berulang melalui senarai terpaut, menyemak sama ada ifa_addr adalah sah, dan kemudian mengambil dan mencetak rentetan alamat IP dengan menukarnya kepada manusia- format boleh dibaca menggunakan inet_ntop().
Untuk mengenal pasti alamat IP awam, anda boleh menyemak antara muka rangkaian nama (cth., "eth0") atau bandingkan alamat IP untuk menentukan yang mana satu sepadan dengan rangkaian luaran.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan semula Alamat IP Mesin Linux secara Pemrograman dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!