首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于在C++ (使用Visual Studio2019)中获取机器的Windows地址,有什么建议吗?

在C++中获取机器的Windows地址,可以使用WinAPI函数GetAdaptersInfoGetAdaptersAddresses来实现。

  1. 使用GetAdaptersInfo函数获取机器的Windows地址:

GetAdaptersInfo函数是一个较旧的API,但在一些较旧的Windows操作系统上仍然有效。该函数返回一个指向IP_ADAPTER_INFO结构体数组的指针,该结构体包含了机器上每个网络适配器的详细信息,包括IP地址、子网掩码、默认网关等。

以下是获取机器的Windows地址的示例代码:

代码语言:txt
复制
#include <iostream>
#include <WinSock2.h>
#include <IPHlpApi.h>

#pragma comment(lib, "IPHLPAPI.lib")

int main() {
    // 调用GetAdaptersInfo函数获取适配器信息
    IP_ADAPTER_INFO* pAdapterInfo = new IP_ADAPTER_INFO();
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    DWORD dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
    
    if (dwRetVal != ERROR_SUCCESS) {
        // 获取失败
        std::cout << "Failed to get adapter information." << std::endl;
        delete pAdapterInfo;
        return 1;
    }
    
    // 遍历适配器信息列表,输出Windows地址
    while (pAdapterInfo != nullptr) {
        std::cout << "Windows Address: " << pAdapterInfo->IpAddressList.IpAddress.String << std::endl;
        pAdapterInfo = pAdapterInfo->Next;
    }
    
    delete pAdapterInfo;
    return 0;
}
  1. 使用GetAdaptersAddresses函数获取机器的Windows地址:

GetAdaptersAddresses函数是一个较新的API,适用于较新版本的Windows操作系统。与GetAdaptersInfo类似,该函数返回一个指向IP_ADAPTER_ADDRESSES结构体链表的指针,该结构体提供了更丰富的适配器信息。

以下是使用GetAdaptersAddresses函数获取机器的Windows地址的示例代码:

代码语言:txt
复制
#include <iostream>
#include <WinSock2.h>
#include <IPHlpApi.h>

#pragma comment(lib, "IPHLPAPI.lib")

int main() {
    // 调用GetAdaptersAddresses函数获取适配器信息
    IP_ADAPTER_ADDRESSES* pAdapterAddresses = nullptr;
    ULONG ulOutBufLen = 0;
    DWORD dwRetVal = GetAdaptersAddresses(AF_UNSPEC, 0, nullptr, nullptr, &ulOutBufLen);
    
    if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
        // 分配足够大的内存
        pAdapterAddresses = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(new BYTE[ulOutBufLen]);
        
        // 再次调用GetAdaptersAddresses函数获取适配器信息
        dwRetVal = GetAdaptersAddresses(AF_UNSPEC, 0, nullptr, pAdapterAddresses, &ulOutBufLen);
        
        if (dwRetVal != ERROR_SUCCESS) {
            // 获取失败
            std::cout << "Failed to get adapter information." << std::endl;
            delete[] reinterpret_cast<BYTE*>(pAdapterAddresses);
            return 1;
        }
        
        // 遍历适配器信息链表,输出Windows地址
        for (IP_ADAPTER_ADDRESSES* pAdapter = pAdapterAddresses; pAdapter != nullptr; pAdapter = pAdapter->Next) {
            if (pAdapter->OperStatus == IfOperStatusUp) {
                for (IP_ADAPTER_UNICAST_ADDRESS* pUnicast = pAdapter->FirstUnicastAddress; pUnicast != nullptr; pUnicast = pUnicast->Next) {
                    sockaddr* pAddr = pUnicast->Address.lpSockaddr;
                    if (pAddr->sa_family == AF_INET) {
                        char strAddr[INET_ADDRSTRLEN];
                        inet_ntop(AF_INET, &reinterpret_cast<sockaddr_in*>(pAddr)->sin_addr, strAddr, INET_ADDRSTRLEN);
                        std::cout << "Windows Address: " << strAddr << std::endl;
                    }
                }
            }
        }
        
        delete[] reinterpret_cast<BYTE*>(pAdapterAddresses);
        return 0;
    }
    
    // 获取失败
    std::cout << "Failed to get adapter information." << std::endl;
    return 1;
}

这些示例代码通过遍历适配器信息列表,输出机器上每个适配器的Windows地址。需要注意的是,由于机器可能存在多个适配器,可能会有多个Windows地址被输出。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供灵活可扩展的虚拟服务器实例,满足各类业务需求。产品介绍链接
  • 弹性公网IP(EIP):为云服务器实例提供静态的公网IP地址,使其能够通过互联网访问。产品介绍链接
  • 专线接入(DC):提供高速、低时延、低抖动的专线接入服务,实现云上云下的安全、稳定的数据传输。产品介绍链接
  • 云数据库MySQL(CMQ):提供稳定可靠的云数据库服务,支持高可用、备份恢复、性能监控等功能。产品介绍链接
  • 弹性容器实例(ECS):提供轻量级、快速启动的容器化应用运行环境,满足各种规模的应用需求。产品介绍链接
  • 人工智能机器学习平台(AI Lab):提供丰富的人工智能开发工具和服务,助力开发者快速构建和部署AI应用。产品介绍链接
  • 物联网通信(IoT Hub):提供稳定可靠的物联网通信平台,支持海量设备接入和数据传输,助力物联网应用开发。产品介绍链接
  • 云存储(COS):提供安全、高效、可靠的云存储服务,满足各类数据存储和访问需求。产品介绍链接
  • 腾讯区块链(TBaaS):提供高性能、高可靠性的区块链服务,支持快速搭建和管理企业级区块链网络。产品介绍链接
  • 腾讯元宇宙:融合VR、AR、MR等技术,打造虚拟现实的沉浸式体验世界。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券