Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mendapatkan semula Alamat IP Mesin Linux secara Pemrograman dalam C?

Bagaimana untuk Mendapatkan semula Alamat IP Mesin Linux secara Pemrograman dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-10 00:19:14330semak imbas

How to Programmatically Retrieve a Linux Machine's IP Addresses in C  ?

Cara Mengambil Alamat IP Mesin Linux dalam C

Masalah:

Tentukan alamat IP Linux mesin secara pengaturcaraan menggunakan C , secara khusus menyasarkan alamat IP awam di kalangan pelbagai potensi alamat.

Penyelesaian:

Menggunakan getifaddrs()

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(&amp;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=&amp;((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=&amp;((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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn