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;
}
VC windows 多网卡情况下 获取当前网卡ip地址的更多相关文章
- Windows下获取本机IP地址方法介绍
Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...
- Linux下获取本机IP地址的代码
Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...
- Eureka在有虚拟网卡的情况下获取正确的IP
发现问题 最近项目在Eureka注册时,发现一个问题:注册的IP地址不是 192.168.0.XXX 的网络IP,而是另外一个网段的地址,如图 通过 ipconfig 命令查看本机的IP地址发现,该I ...
- QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...
- python未知网卡名情况下获取本机IP
import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...
- linux环境下获取真实的ip地址
package inas.test; import java.net.Inet6Address; import java.net.InetAddress; import java.net.Networ ...
- 伪造IP及获取客户端真实IP地址
Fiddler支持自定义规则,可以实现对HTTP请求数据发送给Server前或HTTP应答数据发送给浏览器前进行修改.下面的例子将演示如何向所有HTTP请求数据中增加一个头.1)打开Fiddler,点 ...
- rust下获取本机IP
又拾起了rust语言, 想写一点东西玩一玩, 但是发现连一个获取本机IP地址的库都没有, 还得挽起袖子自己撸. https://crates.io/crates/local_ipaddress 没有用 ...
- CDN下nginx获取用户真实IP地址
随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户 ...
随机推荐
- SprinfJdbcTemplate+SpringMVC 代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)
代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件) 原文地址: http://jilongliang.iteye.com/blog/2262070 p ...
- poj1741 树上距离小于等于k的对数 点分治 入门题
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...
- docker 使用总结
docker run asn@hadoop1:~/Desktop$ docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG ...
- js面向对象(对象/类/工厂模式/构造函数/公有和原型)
https://www.cnblogs.com/sandraryan/ 什么是对象 js中一切都是对象(有行为和特征).js允许自定义对象,也提供了内建对象(string date math等) 对象 ...
- 2015年NOIP普及组复赛题解
题目涉及算法: 金币:入门题: 扫雷游戏:入门题: 求和:简单数学推导: 推销员:贪心. 金币 题目链接:https://www.luogu.org/problem/P2669 入门题,直接开一个循环 ...
- 2019-3-8-win10-uwp-渲染原理-DirectComposition-渲染
title author date CreateTime categories win10 uwp 渲染原理 DirectComposition 渲染 lindexi 2019-03-08 09:18 ...
- linux如何查看nginx是否启动
Nginx是一个高性能的反向代理服务器,现在一般作为我们网站或其他Web服务的第一层代理,用户在浏览器请求首先经过的就是Nginx服务. 如果Nginx服务没有启动或异常结束,将会影响Web服务的正常 ...
- [转]UEditor编辑器两个版本任意文件上传漏洞分析
0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...
- Python--day61--Django的ORM
下载驱动
- H5 canvas 绘图
H5的canvas绘图技术 canvas元素是HTML5中新添加的一个元素,该元素是HTML5中的一个亮点.Canvas元素就像一块画布,通过该元素自带的API结合JavaScript代码可以绘制 ...