答案:C++中获取本机网络接口信息需根据平台选择API,Windows使用GetAdaptersAddresses函数获取IP、MAC等信息,需初始化Winsock并链接iphlpapi.lib和ws2_32.lib;Linux使用getifaddrs函数,遍历接口地址并解析IPv4/IPv6及MAC地址,注意权限与内存释放;跨平台可结合预处理宏或使用Boost.Asio等库封装。

在C++中获取本机所有网络接口信息,通常可以通过调用操作系统提供的API来实现。不同平台的实现方式略有差异,下面分别介绍Windows和Linux系统下的常用方法。
GetAdaptersAddresses函数,它能获取包括IP地址、MAC地址、子网掩码、网关等完整的网络接口信息。需要包含头文件:
#include <iphlpapi.h>#include <winsock2.h>示例代码片段:
// 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return -1;PPIP_ADAPTER_ADDRESSES pAddresses = nullptr;ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(outBufLen);
立即学习“C++免费学习笔记(深入)”;
DWORD dwResult = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen);
if (dwResult == ERROR_BUFFER_OVERFLOW) { free(pAddresses); pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(outBufLen); }
dwResult = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen);
if (dwResult == NO_ERROR) { PIP_ADAPTER_ADDRESSES pAdapter = pAddresses; while (pAdapter) { printf("适配器名称: %s\n", pAdapter->FriendlyName); printf("MAC地址: "); for (int i = 0; i < (int)pAdapter->PhysicalAddressLength; ++i) { printf("%02X", pAdapter->PhysicalAddress[i]); if (i != pAdapter->PhysicalAddressLength - 1) printf("-"); } printf("\n");
IP_ADAPTER_UNICAST_ADDRESS* pUnicast = pAdapter->FirstUnicastAddress;
while (pUnicast) {
sockaddr* saAddr = pUnicast->Address.lpSockaddr;
if (saAddr->sa_family == AF_INET) {
char ipStr[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &((sockaddr_in*)saAddr)->sin_addr, ipStr, INET_ADDRSTRLEN);
printf("IPv4地址: %s\n", ipStr);
}
pUnicast = pUnicast->Next;
}
pAdapter = pAdapter->Next;
}} if (pAddresses) free(pAddresses);WSACleanup();
记得链接库:iphlpapi.lib 和 ws2_32.lib
getifaddrs函数,它是POSIX标准的一部分,可跨多数Unix-like系统使用。需要包含头文件:
#include <ifaddrs.h>#include <netinet/in.h>#include <arpa/inet.h>#include <net/ethernet.h>示例代码:
struct ifaddrs *ifAddrStruct = nullptr;struct ifaddrs *ifa = nullptr;getifaddrs(&ifAddrStruct);
for (ifa = ifAddrStruct; ifa != nullptr; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) continue;
int family = ifa->ifa_addr->sa_family;
if (family == AF_INET || family == AF_INET6) {
char addressBuffer[INET6_ADDRSTRLEN];
void* tmpAddrPtr = nullptr;
if (family == AF_INET) {
tmpAddrPtr = &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
inet_ntop(family, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("接口: %s IPv4地址: %s\n", ifa->ifa_name, addressBuffer);
} else {
tmpAddrPtr = &((struct sockaddr_in6*)ifa->ifa_addr)->sin6_addr;
inet_ntop(family, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("接口: %s IPv6地址: %s\n", ifa->ifa_name, addressBuffer);
}
}
if (family == AF_PACKET && ifa->ifa_data) {
struct ether_header* eth = (struct ether_header*)ifa->ifa_data;
unsigned char* mac = (unsigned char*)eth->ether_shost;
if (mac[0] + mac[1] + mac[2] + mac[3] + mac[4] + mac[5] > 0) {
printf("接口: %s MAC地址: %02x:%02x:%02x:%02x:%02x:%02x\n",
ifa->ifa_name,
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
}} if (ifAddrStruct) freeifaddrs(ifAddrStruct);
也可以考虑使用第三方库如Boost.Asio或Poco,它们封装了底层细节,提供统一接口。
基本上就这些。根据目标平台选择合适的方法,注意权限(Linux下可能需要root或cap_net_admin)和内存管理即可。
以上就是c++++怎么获取本机所有网络接口信息_c++本机网络接口获取方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号