2. CPP文件(代码应用示范卡塔 尔(阿拉伯语:قطر
/////////////////////////////////////////
//
// FileName : NetCardVer.cpp
// Creator : PeterZ
// Date : 2018-6-21 23:50
// Comment : 网卡信息筛选
// Editor : Visual Studio 2017
//
/////////////////////////////////////////
#include "NetInfoProc.h"
void Output1(PIP_ADAPTER_INFO pIpAdapterInfo); //结果输出1(正常结果)
void Output2(PIP_ADAPTER_INFO pIpAdapterInfo); //结果输出2(删除虚拟网卡的结果)
void Output3(PIP_ADAPTER_INFO pIpAdapterInfo); //结果输出3(去除非PCI物理网卡) >>需要以管理员权限运行程序<<
void Output4(PIP_ADAPTER_INFO pIpAdapterInfo); //结果输出4(筛选内网网卡)
//主函数
int main(void)
{
PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
if (ERROR_BUFFER_OVERFLOW == nRel/*GetAdaptersInfo参数传递的内存空间不足*/)
{
//free(pIpAdapterInfo);
pIpAdapterInfo = (PIP_ADAPTER_INFO)realloc(pIpAdapterInfo, stSize);
nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
}
if (ERROR_SUCCESS == nRel)
{
printf(">>>>>>>>> 正常结果 <<<<<<<<<<<nn");
Output1(pIpAdapterInfo);
printf("nn>>>>>>>>> 删除虚拟网卡的结果 <<<<<<<<<nn");
Output2(pIpAdapterInfo);
printf("nn>>>>>>>>> 去除非PCI物理网卡的结果 <<<<<<<<<nn");
Output3(pIpAdapterInfo);
printf("nn>>>>>>>>> 筛选内网网卡的结果 <<<<<<<<<nn");
Output4(pIpAdapterInfo);
}
if (pIpAdapterInfo)
{
free(pIpAdapterInfo);
}
system("pause");
return 0;
}
//结果输出1(正常结果)
void Output1(PIP_ADAPTER_INFO pIpAdapterInfo)
{
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//输出信息
cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
cout << "网卡MAC地址:" << pIpAdapterInfo->Address;
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
{
if (i == pIpAdapterInfo->AddressLength - 1)
{
printf("%02xn", pIpAdapterInfo->Address[i]);
}
else
{
printf("%02x-", pIpAdapterInfo->Address[i]);
}
}
cout << "网卡IP地址如下:" << endl;
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
//可能网卡有多IP,因此通过循环去判断
do
{
cout << pIpAddrString->IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
pIpAdapterInfo = pIpAdapterInfo->Next;
cout << "*****************************************************" << endl;
}
return;
}
//结果输出2(删除虚拟网卡的结果)
void Output2(PIP_ADAPTER_INFO pIpAdapterInfo)
{
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//去除虚拟网卡IP
if (IsVirtualNetCard(pIpAdapterInfo))
{
pIpAdapterInfo = pIpAdapterInfo->Next;
continue;
}
//输出信息
cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
cout << "网卡MAC地址:" << pIpAdapterInfo->Address;
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
{
if (i == pIpAdapterInfo->AddressLength - 1)
{
printf("%02xn", pIpAdapterInfo->Address[i]);
}
else
{
printf("%02x-", pIpAdapterInfo->Address[i]);
}
}
cout << "网卡IP地址如下:" << endl;
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
//可能网卡有多IP,因此通过循环去判断
do
{
cout << pIpAddrString->IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
pIpAdapterInfo = pIpAdapterInfo->Next;
cout << "*****************************************************" << endl;
}
return;
}
//结果输出3(去除非PCI物理网卡)
void Output3(PIP_ADAPTER_INFO pIpAdapterInfo)
{
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//去除非PCI物理网卡
if (IsPCINetCard(pIpAdapterInfo) != IS_PCI)
{
if (IsPCINetCard(pIpAdapterInfo) == REG_ERROR)
{
printf("1n");
return;
}
pIpAdapterInfo = pIpAdapterInfo->Next;
continue;
}
//输出信息
cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
cout << "网卡MAC地址:" << pIpAdapterInfo->Address;
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
{
if (i == pIpAdapterInfo->AddressLength - 1)
{
printf("%02xn", pIpAdapterInfo->Address[i]);
}
else
{
printf("%02x-", pIpAdapterInfo->Address[i]);
}
}
cout << "网卡IP地址如下:" << endl;
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
//可能网卡有多IP,因此通过循环去判断
do
{
cout << pIpAddrString->IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
pIpAdapterInfo = pIpAdapterInfo->Next;
cout << "*****************************************************" << endl;
}
return;
}
//结果输出4(筛选内网网卡)
void Output4(PIP_ADAPTER_INFO pIpAdapterInfo)
{
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//筛选内网网卡
if (!IsIntranetIP(pIpAdapterInfo))
{
pIpAdapterInfo = pIpAdapterInfo->Next;
continue;
}
//输出信息
cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
cout << "网卡MAC地址:" << pIpAdapterInfo->Address;
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
{
if (i == pIpAdapterInfo->AddressLength - 1)
{
printf("%02xn", pIpAdapterInfo->Address[i]);
}
else
{
printf("%02x-", pIpAdapterInfo->Address[i]);
}
}
cout << "网卡IP地址如下:" << endl;
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
//可能网卡有多IP,因此通过循环去判断
do
{
cout << pIpAddrString->IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
pIpAdapterInfo = pIpAdapterInfo->Next;
cout << "*****************************************************" << endl;
}
return;
}
2. 有个别管用的方法
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
int ipAddressInt = wm.getConnectionInfo().getIpAddress();
String ipAddress = String.format(Locale.getDefault(), "%d.%d.%d.%d", (ipAddressInt & 0xff), (ipAddressInt >> 8 & 0xff), (ipAddressInt >> 16 & 0xff), (ipAddressInt >> 24 & 0xff));
办法实践所需权限为:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
急需申明的是,上述代码第二行重临的是三个int类型的值,如1795336384,它对应的十九进制值6b02a8c0每两位便对应IPv4地址的每生机勃勃项(逆序,如c0转变为十进制为192卡塔 尔(英语:State of Qatar)。
经测验,通过该格局能够拿走当前WiFi网络中Android设备的IPv4地址,但是明显,该方法是通过WifiManager获取当前网络连接下的IP地址的,因而它只局限于接受WiFi网络的事态,当使用蜂窝等此外互联网设施时,该情势行不通,会重返0值。其它,假让你是经过比较黑客的办法比方未有经过系统Framework层展开WiFi,而是本身通过Linux命令成立的WiFi互连网,那么像这种Framework层提供的API也是不起成效的。
拿到本机全部IPV4地址:
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
foreach (IPAddress ipa in ipadrlist)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
Console.Writeline(ipa.ToString());
}
若要单单获取ipv4地址,能够用IPAdress.AddressFamily
属性推断:对于 IPv4,再次来到 InterNetwork;对于 IPv6,再次来到 InterNetworkV6。
可是少年老成旦本机可能有八个ipv4的地点,那什么样收获访问暗许网关时使用的网卡IP呢。在CSDN论坛找到了大神的方法,用的是询问本机路由表。
收获本机正在使用的ipv4地址(访谈网络的IP),可别小看,依旧有无数索要考虑的:
1.叁个微处理机有多少个网卡,有线的、有线的、还会有vmare设想的五个网卡。
2.就算唯有一个网卡,可是该网卡配置了N个IP地址.当中还包罗ipv6地址。
下边贴三个自己直接采纳的不二等秘书诀,它经过询问本机路由表,获取访问暗中同意网关时使用的网卡IP。
用了2年了,屡试不爽。
/// <summary>
/// 获取当前使用的IP
/// </summary>
/// <returns></returns>
public static string GetLocalIP()
{
string result = RunApp("route", "print",true);
Match m = Regex.Match(result, @"0.0.0.0s+0.0.0.0s+(d+.d+.d+.d+)s+(d+.d+.d+.d+)");
if (m.Success)
{
return m.Groups[2].Value;
}
else
{
try
{
System.Net.Sockets.TcpClient c = new System.Net.Sockets.TcpClient();
c.Connect("www.baidu.com", 80);
string ip = ((System.Net.IPEndPoint)c.Client.LocalEndPoint).Address.ToString();
c.Close();
return ip;
}
catch (Exception)
{
return null;
}
}
}
/// <summary>
/// 获取本机主DNS
/// </summary>
/// <returns></returns>
public static string GetPrimaryDNS()
{
string result = RunApp("nslookup", "",true);
Match m = Regex.Match(result, @"d+.d+.d+.d+");
if (m.Success)
{
return m.Value;
}
else
{
return null;
}
}
/// <summary>
/// 运行一个控制台程序并返回其输出参数。
/// </summary>
/// <param name="filename">程序名</param>
/// <param name="arguments">输入参数</param>
/// <returns></returns>
public static string RunApp(string filename, string arguments,bool recordLog)
{
try
{
if (recordLog)
{
Trace.WriteLine(filename + " " + arguments);
}
Process proc = new Process();
proc.StartInfo.FileName = filename;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.Arguments = arguments;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
using (System.IO.StreamReader sr = new System.IO.StreamReader(proc.StandardOutput.BaseStream, Encoding.Default))
{
//string txt = sr.ReadToEnd();
//sr.Close();
//if (recordLog)
//{
// Trace.WriteLine(txt);
//}
//if (!proc.HasExited)
//{
// proc.Kill();
//}
//上面标记的是原文,下面是我自己调试错误后自行修改的
Thread.Sleep(100); //貌似调用系统的nslookup还未返回数据或者数据未编码完成,程序就已经跳过直接执行
//txt = sr.ReadToEnd()了,导致返回的数据为空,故睡眠令硬件反应
if (!proc.HasExited) //在无参数调用nslookup后,可以继续输入命令继续操作,如果进程未停止就直接执行
{ //txt = sr.ReadToEnd()程序就在等待输入,而且又无法输入,直接掐住无法继续运行
proc.Kill();
}
string txt = sr.ReadToEnd();
sr.Close();
if (recordLog)
Trace.WriteLine(txt);
return txt;
}
}
catch (Exception ex)
{
Trace.WriteLine(ex);
return ex.Message;
}
}
大神代码源自帖子:
另有生龙活虎种办法通过用ipconfig来拿到:
private void GetIP()
{
Process cmd = new Process();
cmd.StartInfo.FileName = "ipconfig.exe";//设置程序名
cmd.StartInfo.Arguments = "/all"; //参数
//重定向标准输出
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = true;//不显示窗口(控制台程序是黑屏)
//cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//暂时不明白什么意思
/*
收集一下 有备无患
关于:ProcessWindowStyle.Hidden隐藏后如何再显示?
hwndWin32Host = Win32Native.FindWindow(null, win32Exinfo.windowsName);
Win32Native.ShowWindow(hwndWin32Host, 1); //先FindWindow找到窗口后再ShowWindow
*/
cmd.Start();
string info = cmd.StandardOutput.ReadToEnd();
cmd.WaitForExit();
cmd.Close();
textBox1.AppendText(info);
}
那个时候将要自身入手看哪样截取了。可参看下边大神如何用正则表明式来合作。
本文主要研商的是应用Python获取本机全数网卡ip,掩码和播放地址,分享了相关的实例代码,具体介绍如下。
简介
在Socket编制程序的时候,大家须求实时获取我们所急需的IP地址。举个例子在编排后门的时候,我们恐怕要求拿到平价的外网IP或内网IP;一时候我们大概要求判断我们取得的是否是设想机网卡,此时就须要对每一张网卡上的特征实行鉴定区别。以下小编总括了有个别常用的拍卖办法供我们仿效。
参考资料:1.
领取网卡消息方法
2.
编造与物理网卡区分方法
直接以来,好像向来不意气风发段正式的代码能提供Android设备这个时候的IP地址,究其原因,Android设备的网卡大概不仅仅叁个,如马蜂窝卡、WiFi网卡,况兼同一个网卡也会有所持续多个IP地址。基于此,三个Android终端很有相当的大只怕还要兼有多个IP地址(不只是同不平日间具备IPv4和IPv6地址卡塔 尔(英语:State of Qatar),举个例子敞开热门分享蜂窝互连网的时候,马蜂窝卡具备三个IPv4地址来探望外网,WiFi网卡具备一个IPv4地址来作为内网的网关。
赢得本机全数IP地址:
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
这么些地址是包蕴全数网卡(设想网卡卡塔 尔(阿拉伯语:قطر的ipv4和ipv6地址。
总结
相关文章
- 微软:想在WinBlue中平复起来开关?我们听见了 – Windows7之家,Win7之家
- 先是次:从今起始玩Linux,Ubuntu16.04
- 【www.301.net】TechRepublic总编:给Windows 7的五条忠告 – Windows7之家,Win7之家
- 首批从外太空拍录的3D照片 – Windows7之家,Win7之家
- Kdump 专门的学业流程
- www.301.netWin8不达预期 比尔·盖茨应重新出山拯救微软 – Windows7之家,Win7之家
- 怎么在 Fedora 职业站上截图
- www.301.netWindows cmd
- www.301.net:喇叭吹响:微软为Windows 7 奠定基本功 – Windows7之家,Win7之家
- 谷歌(Google卡塔尔 Reader等应用4月1日起不再补助IE6 – Windows7之家,Win7之家