在多網卡環境下,我們怎麼來獲取自己當前使用的網卡信息了?
通過判斷網關,因爲多網卡一次也只能一個網卡上網,能上網的網卡肯定存在網關
bool GetIPAndGateWay(std::string& strIp, std::string& strMac, std::string& strGateWay, std::string &strGateWayMac)
{
strIp = "";
strGateWay = "";
strMac = "";
strGateWayMac = "";
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD errValue = 0;
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
if (!pAdapterInfo)//malloc失敗
return false;
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) //空間不夠,重新分配
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
if (!pAdapterInfo) //malloc失敗
return false;
}
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter)
{
CString mac;
mac.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"), pAdapter->Address[0], pAdapter->Address[1], \
pAdapter->Address[2], pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5]);
strMac = mac;
strIp = pAdapter->IpAddressList.IpAddress.String;
strGateWay= pAdapter->GatewayList.IpAddress.String;
if (strGateWay!= "0.0.0.0")
break;
pAdapter = pAdapter->Next;
}
}
else
{
return false;
}
if (pAdapterInfo)
free(pAdapterInfo);
GetGateWayMac(strGateWay, strGateWayMac);
return true;
}
void GetGateWayMac(const std::string &strip, std::string &strmac)
{
if (strip.empty()) return;
strmac = "";
ULONG uSize = 0;
PMIB_IPNETTABLE pIpNetTable = nullptr;
DWORD dwRet = GetIpNetTable(pIpNetTable, &uSize, false);
if (dwRet == ERROR_INSUFFICIENT_BUFFER)
{
pIpNetTable = (PMIB_IPNETTABLE)malloc(uSize);
if (NO_ERROR == GetIpNetTable(pIpNetTable, &uSize, false))
{
PMIB_IPNETROW pIpNetRow = pIpNetTable->table;
in_addr inaddr;
for (int k = 0; k < pIpNetTable->dwNumEntries; ++k)
{
char szIp[32] = "", szMac[64] = "";
//IP地址
inaddr.S_un.S_addr = pIpNetRow[k].dwAddr;
strcpy(szIp, inet_ntoa(inaddr));
if (strip != szIp) continue;
//過濾Mac爲空的
if (pIpNetRow[k].dwPhysAddrLen <= 0) continue;
UCHAR bPhysAddr[MAXLEN_PHYSADDR] = { 0 };
if (0 == memcmp(pIpNetRow[k].bPhysAddr, bPhysAddr, pIpNetRow[k].dwPhysAddrLen)) continue;
//MAC地址
for (int j = 0; j < pIpNetRow[k].dwPhysAddrLen; j++)
{
if (lstrcmp(szMac, "") == 0)
sprintf(szMac, "%02x", pIpNetRow[k].bPhysAddr[j]);
else
sprintf(szMac, "%s-%02x", szMac, pIpNetRow[k].bPhysAddr[j]);
}
strmac = szMac;
break;
}
}
}
if (pIpNetTable)
free(pIpNetTable);
}
參考博客:
https://blog.csdn.net/yangyang031213/article/details/64906437