在C++中获取机器的Windows地址,可以使用WinAPI函数GetAdaptersInfo
或GetAdaptersAddresses
来实现。
GetAdaptersInfo
函数获取机器的Windows地址:GetAdaptersInfo
函数是一个较旧的API,但在一些较旧的Windows操作系统上仍然有效。该函数返回一个指向IP_ADAPTER_INFO
结构体数组的指针,该结构体包含了机器上每个网络适配器的详细信息,包括IP地址、子网掩码、默认网关等。
以下是获取机器的Windows地址的示例代码:
#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;
}
GetAdaptersAddresses
函数获取机器的Windows地址:GetAdaptersAddresses
函数是一个较新的API,适用于较新版本的Windows操作系统。与GetAdaptersInfo
类似,该函数返回一个指向IP_ADAPTER_ADDRESSES
结构体链表的指针,该结构体提供了更丰富的适配器信息。
以下是使用GetAdaptersAddresses
函数获取机器的Windows地址的示例代码:
#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地址被输出。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云