如何用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(&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; }
解釋:
解釋:解釋:解釋:解釋:此程式碼使用ifa循環迭代所有網路介面並檢查每個介面的位址族。如果是 IPv4 或 IPv6,它會將位址轉換為字串並將其與介面名稱一起列印。 此方法可讓您偵測指派給 Linux 電腦的所有 IP 位址並識別所需的公用 IP 進行綁定目的。以上是如何用 C 語言以程式設計方式取得 Linux 機器的公用 IP 位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!