首页 > 后端开发 > C++ > 正文

c++怎么获取本机所有网络接口信息_c++本机网络接口获取方法

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

c++怎么获取本机所有网络接口信息_c++本机网络接口获取方法

在C++中获取本机所有网络接口信息,通常可以通过调用操作系统提供的API来实现。不同平台的实现方式略有差异,下面分别介绍Windows和Linux系统下的常用方法。

Windows平台:使用GetAdaptersAddresses

Windows系统推荐使用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.libws2_32.lib

创客贴设计
创客贴设计

创客贴设计,一款智能在线设计工具,设计不求人,AI助你零基础完成专业设计!

创客贴设计 150
查看详情 创客贴设计

Linux平台:使用getifaddrs

Linux下推荐使用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);

跨平台建议

若需编写跨平台程序,可使用预处理宏区分系统:#ifdef _WIN32 // 调用GetAdaptersAddresses #else // 调用getifaddrs #endif

也可以考虑使用第三方库如Boost.Asio或Poco,它们封装了底层细节,提供统一接口。

基本上就这些。根据目标平台选择合适的方法,注意权限(Linux下可能需要root或cap_net_admin)和内存管理即可。

以上就是c++++怎么获取本机所有网络接口信息_c++本机网络接口获取方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号