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

Bagaimana Cara Mendapatkan Alamat IP Awam Mesin Linux secara Pemrograman dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-12-10 09:18:14442semak imbas

How to Programmatically Get a Linux Machine's Public IP Address in C  ?

Cara Mendapatkan Alamat IP Mesin Linux secara Pemrograman dalam C

Pengenalan:

Artikel ini menangani cabaran pengaturcaraan biasa: menentukan alamat IP mesin Linux yang menjalankan aplikasi yang ditulis dalam C . Tumpuan di sini adalah untuk mendapatkan alamat IP luaran atau awam pelayan.

Pernyataan Masalah:

Tugasnya adalah untuk membangunkan program C yang mendapatkan semula alamat IP mesin Linux, khususnya yang diberikan kepada rangkaian tertentu (IP awam). Ini memastikan aplikasi boleh mengikat dirinya pada alamat luaran yang dikehendaki untuk komunikasi rangkaian.

Penyelesaian:

Untuk menyelesaikan masalah ini, kami memanfaatkan panggilan fungsi getifaddrs(), yang merupakan sebahagian daripada standard POSIX dan dengan itu tersedia di Linux. Fungsi ini menyediakan cara yang mudah untuk beralih melalui semua antara muka rangkaian dan mendapatkan semula alamat IP mereka.

Pelaksanaan:

Kod C berikut menunjukkan cara menggunakan getifaddrs() fungsi:

#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;
}

Penjelasan:

Kod ini berulang melalui semua antara muka rangkaian menggunakan gelung ifa dan menyemak keluarga alamat setiap antara muka. Jika IPv4 atau IPv6, ia menukar alamat kepada rentetan dan mencetaknya bersama-sama dengan nama antara muka.

Pendekatan ini membolehkan anda mengesan semua alamat IP yang diberikan kepada mesin Linux dan mengenal pasti IP awam yang dikehendaki untuk mengikat tujuan.

Atas ialah kandungan terperinci Bagaimana Cara Mendapatkan Alamat IP Awam 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