在多网卡的情况下,你可以使用C++结合操作系统提供的网络API来获取当前连接的IP地址。以下是一个基于Windows平台的示例代码,演示如何获取当前连接的IP地址:
#include <iostream>
#include <winsock2.h>
#include <iphlpapi.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return 1;
}
// 获取所有网络适配器信息
PIP_ADAPTER_INFO pAdapterInfo = nullptr;
DWORD dwBufLen = sizeof(IP_ADAPTER_INFO);
if (GetAdaptersInfo(pAdapterInfo, &dwBufLen) == ERROR_BUFFER_OVERFLOW) {
pAdapterInfo = (IP_ADAPTER_INFO*)malloc(dwBufLen);
if (pAdapterInfo == nullptr) {
std::cerr << "Failed to allocate memory for pAdapterInfo." << std::endl;
WSACleanup();
return 1;
}
}
if (GetAdaptersInfo(pAdapterInfo, &dwBufLen) == NO_ERROR) {
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
while (pAdapter) {
// 遍历每个网络适配器,查找当前连接的适配器
if (pAdapter->Type == IF_TYPE_ETHERNET_CSMACD || pAdapter->Type == IF_TYPE_PPPOE) {
IP_ADDR_STRING ipAddressList[IP_MAX_MULTICAST_GROUPS];
DWORD dwIndex = pAdapter->IfIndex;
// 获取指定适配器的IP地址
if (GetAdaptersAddresses(AF_INET, 0, nullptr, pAdapter, &dwIndex, nullptr, &ipAddressList[0], &dwBufLen) == NO_ERROR) {
for (int i = 0; i < (int)ipAddressList[0].IpAddressCount; i++) {
std::cout << "IP Address: " << inet_ntoa(ipAddressList[0].IpAddressList[i]) << std::endl;
}
}
}
pAdapter = pAdapter->Next;
}
}
if (pAdapterInfo) {
free(pAdapterInfo);
}
WSACleanup();
return 0;
}
这段代码使用了Windows的GetAdaptersInfo
和GetAdaptersAddresses
函数来获取网络适配器信息和IP地址。它首先通过GetAdaptersInfo
获取所有网络适配器的信息,然后遍历每个适配器,查找类型为以太网或PPPoE的适配器。对于每个符合条件的适配器,它使用GetAdaptersAddresses
获取该适配器的IP地址,并打印出来。