用C 語言檢索本地IP 位址和子網路遮罩
在網路程式設計領域,經常需要確定IP 位址和子網路本地電腦的掩碼。此資訊可用於多種目的,例如在本地網路上發送訊息。
檢索本地 IP 位址和子網路遮罩的任務可能看起來很簡單,但它可能比最初看起來要棘手。許多電腦可能有多個分配給不同網路介面的 IP 位址。因此,了解哪個 IP 位址與特定網路上下文相關非常重要。
在某些情況下,從程式正在與之通訊的遠端電腦請求 IP 位址可能會更有益。這種方法可讓您確定該特定電腦所看到的 IP 位址,確保連線上下文中的相關性。
Unix/Mac 實作
對於 Unix 和Mac 系統中,建議使用 getifaddrs() 函數來擷取所有與本機電腦關聯的 IP 位址的清單。以下是一個範例程式碼片段:
#include <ifaddrs.h> void GetNetworkInterfaceInfos() { struct ifaddrs *ifaddr; int status = getifaddrs(&ifaddr); if (status != 0) { // Error handling } for (struct ifaddrs *ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) { continue; } if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4 address struct sockaddr_in *in = (struct sockaddr_in *)ifa->ifa_addr; printf("IP address: %s\n", inet_ntoa(in->sin_addr)); // Get subnet mask if available if (ifa->ifa_netmask != NULL) { struct sockaddr_in *mask = (struct sockaddr_in *)ifa->ifa_netmask; printf("Subnet mask: %s\n", inet_ntoa(mask->sin_addr)); } } else if (ifa->ifa_addr->sa_family == AF_INET6) { // IPv6 address // Handle IPv6 addresses here } } freeifaddrs(ifaddr); }
Windows 實作
在Windows 上,可以使用GetAdaptersAddresses() 函數來實作類似的功能:
#include <iphlpapi.h> void GetNetworkInterfaceInfos() { PIP_ADAPTER_ADDRESSES adapter_addresses; ULONG size = 0; GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapter_addresses, &size); adapter_addresses = (PIP_ADAPTER_ADDRESSES)HeapAlloc(GetProcessHeap(), 0, size); GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapter_addresses, &size); for (PIP_ADAPTER_ADDRESSES adapter = adapter_addresses; adapter; adapter = adapter->Next) { printf("IP address: %s\n", adapter->IpAddressList.IpAddress.String); // Get subnet mask if available if (adapter->SubnetMaskList.IpAddress.String) { printf("Subnet mask: %s\n", adapter->SubnetMaskList.IpAddress.String); } } HeapFree(GetProcessHeap(), 0, adapter_addresses); }
其他注意事項
處理多個 IP 位址時,必須考慮哪一個適合您的特定要求。此決定將取決於您的程式的上下文和網路配置。透過了解本機 IP 位址檢索的細微差別,您可以有效地將這些資訊用於各種網路應用程式。
以上是如何在C語言中確定本地IP位址和子網路遮罩?的詳細內容。更多資訊請關注PHP中文網其他相關文章!