VC windows 多网卡情况下 获取当前网卡ip地址
生活随笔
收集整理的這篇文章主要介紹了
VC windows 多网卡情况下 获取当前网卡ip地址
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考
代碼如下?記錄下以后用得到或者能幫到有需要的朋友
#include <iostream> #include <WinSock2.h> #include <Iphlpapi.h> #pragma comment(lib,"Ws2_32.lib") #pragma comment(lib,"Iphlpapi.lib") #define NOIPROUTETABLE 0 #define SUCCESS 1 #define IPROUTETABLEZERO -1 class LocalIpInfo { public:LocalIpInfo(){} public:inline int GetCurrentUsingIp(std::string& strLoalhostIp){PMIB_IPFORWARDTABLE pIpRouteTable = GetIpForwardTable(TRUE);if (pIpRouteTable != NULL){DWORD i, dwCurrIndex;struct in_addr inadDest;struct in_addr inadMask;struct in_addr inadGateway;char szDestIp[128] = { 0 };char szMaskIp[128] = { 0 };char szGatewayIp[128] = { 0 };DWORD IfIndex = 0;DWORD ForwardMetric1 = 0;if (pIpRouteTable->dwNumEntries > 0){int i = 0;for (i = 0; i < pIpRouteTable->dwNumEntries; i++){dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;// 目的地址 ?inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;strcpy_s(szDestIp, sizeof(szDestIp), inet_ntoa(inadDest));// 子網掩碼 ?inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;strcpy_s(szMaskIp, sizeof(szDestIp), inet_ntoa(inadMask));// 網關地址 ?inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;strcpy_s(szGatewayIp, sizeof(szDestIp), inet_ntoa(inadGateway));if ((strcmp(szDestIp, "0.0.0.0") == 0) && (strcmp(szMaskIp, "0.0.0.0") == 0)){if (i == 0){ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1;IfIndex = pIpRouteTable->table[i].dwForwardIfIndex;struct in_addr inadDest;inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;}else if (ForwardMetric1 > pIpRouteTable->table[i].dwForwardMetric1){ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1;IfIndex = pIpRouteTable->table[i].dwForwardIfIndex;struct in_addr inadDest;inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;}}}}else{FreeIpForwardTable(pIpRouteTable);return IPROUTETABLEZERO;}FreeIpForwardTable(pIpRouteTable);if (IfIndex > 0){DWORD ipdwSize = 0;DWORD ipdwRetval;PBYTE m_pBuffer = new BYTE[MAX_PATH];ULONG m_ulSize = MAX_PATH;MIB_IPADDRTABLE *pIPAddrTable;DWORD m_dwResult;PMIB_IPADDRTABLE pAddrTable;PMIB_IPADDRROW pAddrRow;in_addr ia;GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE);delete[] m_pBuffer;m_pBuffer = new BYTE[m_ulSize];if (NULL != m_pBuffer){m_dwResult = GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE);if (m_dwResult == NO_ERROR){pAddrTable = (PMIB_IPADDRTABLE)m_pBuffer;for (int x = 0; x < pAddrTable->dwNumEntries; x++){pAddrRow = (PMIB_IPADDRROW) &(pAddrTable->table[x]);ia.S_un.S_addr = pAddrRow->dwAddr;char IPMsg[100] = { 0 };if (IfIndex == pAddrRow->dwIndex){LPCSTR psz = inet_ntoa(ia);if (psz){strLoalhostIp = psz;}delete[] m_pBuffer;return SUCCESS;}}}else{}delete[] m_pBuffer;}}}else{FreeIpForwardTable(pIpRouteTable);return NOIPROUTETABLE;}return NOIPROUTETABLE;} private:inline void FreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab){if (pIpRouteTab != NULL){::GlobalFree(pIpRouteTab);pIpRouteTab == NULL;}}inline PMIB_IPFORWARDTABLE GetIpForwardTable(BOOL bOrder){PMIB_IPFORWARDTABLE pIpRouteTab = NULL;DWORD dwActualSize = 0;// 查詢所需緩沖區的大小 ?if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER){// 為MIB_IPFORWARDTABLE結構申請內存 ?pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);// 獲取路由表 ?if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)return pIpRouteTab;::GlobalFree(pIpRouteTab);}return NULL;} }; int main() {LocalIpInfo local_Address_info;std::string strLocalIP;local_Address_info.GetCurrentUsingIp(strLocalIP);std::cout << strLocalIP.c_str() << std::endl;system("pause");return 0; }
轉載于:https://www.cnblogs.com/guolongzheng/p/11010553.html
總結
以上是生活随笔為你收集整理的VC windows 多网卡情况下 获取当前网卡ip地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Angr 初体验之探索口令
- 下一篇: Rabbitmq集群高可用部署详细