ホームページ > バックエンド開発 > C++ > C で Linux マシンの IP アドレスをプログラム的に取得する方法

C で Linux マシンの IP アドレスをプログラム的に取得する方法

Mary-Kate Olsen
リリース: 2024-12-10 00:19:14
オリジナル
332 人が閲覧しました

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

C で Linux マシンの IP アドレスを取得する方法

問題:

Linux の IP アドレスを確認するC を使用してプログラム的にマシンを作成し、複数の潜在的な IP アドレスの中から特にパブリック IP アドレスをターゲットにします。

解決策:

getifaddrs() の使用

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(&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;
}
ログイン後にコピー

コード内では、getifaddrs() は ifAddrStruct リンク リストにネットワーク インターフェイス情報を入力します。各 ifaddrs 構造体には、IP アドレスを表すソケット アドレス構造体へのポインターである ifa_addr メンバーが含まれています。 AF_INET は IPv4 アドレス用で、AF_INET6 は IPv6 アドレス用です。

コードはリンク リストを反復処理し、ifa_addr が有効かどうかを確認し、IP アドレス文字列を人間のアドレスに変換して取得して出力します。 inet_ntop() を使用して読み取り可能な形式です。

パブリック IP アドレスを識別するには、ネットワーク インターフェイス名を確認できます。 (例: "eth0") または IP アドレスを比較して、どれが外部ネットワークに一致するかを判断します。

以上がC で Linux マシンの IP アドレスをプログラム的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート