首頁 >後端開發 >C++ >如何用 C 語言以程式設計方式取得 Linux 機器的公用 IP 位址?

如何用 C 語言以程式設計方式取得 Linux 機器的公用 IP 位址?

Patricia Arquette
Patricia Arquette原創
2024-12-10 09:18:14441瀏覽

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

如何用C 語言以編程方式獲取Linux 機器的IP 地址

簡介:

本文解決了一個常見的程式設計挑戰:確定執行用C 編寫的應用程式的Linux 電腦的IP 位址。這裡的重點是取得伺服器的外部或公共IP位址。

問題陳述:

任務是開發一個檢索IP位址的C程式Linux 機器,特別是分配給指定網路(公用 IP)的機器。這確保應用程式可以將自身綁定到所需的外部位址以進行網路通訊。

解決方案:

為了解決這個問題,我們利用 getifaddrs() 函數調用,它是 POSIX 標準的一部分,因此可在 Linux 上使用。此函數提供了一種遍歷所有網路介面並檢索其 IP 位址的便捷方法。

實作:

以下C 程式碼示範如何使用getifaddrs()函數:

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

解釋:

解釋:

解釋:解釋:解釋:此程式碼使用ifa循環迭代所有網路介面並檢查每個介面的位址族。如果是 IPv4 或 IPv6,它會將位址轉換為字串並將其與介面名稱一起列印。 此方法可讓您偵測指派給 Linux 電腦的所有 IP 位址並識別所需的公用 IP 進行綁定目的。

以上是如何用 C 語言以程式設計方式取得 Linux 機器的公用 IP 位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn