問題:
Linux の IP アドレスを確認するC を使用してプログラム的にマシンを作成し、複数の潜在的な IP アドレスの中から特にパブリック IP アドレスをターゲットにします。
解決策:
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(&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; }
コード内では、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 サイトの他の関連記事を参照してください。