区分物理IP和虚拟机IP

生活的意义在于对人类全体发生兴趣,并与之合作,为我们的世界作出贡献,他们也在努力地培养着爱情和对社会的兴趣。

工作中遇到一个问题,如何从Windows平台下众多的IP中找到所需要的物理IP?

手动查找

通过手动查找的方式,是可以很轻松的找到该IP:ipconfig /all。执行该命令后,我们能看到下列数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
以太网适配器 以太网:
物理地址. . . . . . . . . . . . . : FC-AA-14-14-5D-1F
IPv4 地址 . . . . . . . . . . . . : 172.77.167.37(首选)
以太网适配器 VMware Network Adapter VMnet1:
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-01
IPv4 地址 . . . . . . . . . . . . : 192.168.73.1(首选)
以太网适配器 VMware Network Adapter VMnet8:
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-08
IPv4 地址 . . . . . . . . . . . . : 192.168.50.1(首选)

通过名称,就可以看出以太网对应的IPv4地址172.77.167.37就是我们需要的物理IP地址。

程序查找

然而如何通过程序区分呢?在我的Windows电脑上,存在8个网络接口,其中包括:

  • 回环地址
  • 虚拟机地址
  • IPv4地址
  • IPv6地址

如果找到我们需要的物理IPv4地址呢?需要一一筛选。

  • 回环地址:127.0.0.1
  • 虚拟机地址:通过Mac地址来区分,虚拟机Mac地址的格式为00-50-56(十六进制)
  • IPv6地址:很长很长的一撮,很好区分
  • IPv4地址:剩下的就是IPv4地址了

使用第三方库Poco的区分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
using Poco::Net::NetworkInterface;
std::string address;
NetworkInterface::NetworkInterfaceList list = NetworkInterface::list();
for (auto iter = list.begin(); iter != list.end(); ++iter) {
NetworkInterface::MACAddress mac = iter->macAddress();
if (!iter->address().isLoopback() &&
!(mac[0] == 0x00 && mac[1] == 0x50 && mac[2] == 0x56) &&
iter->address().isIPv4Compatible()) {
address = iter->address().toString();
}
}

本文作者:ZeroJiu
本文链接: http://www.freehacker.cn/platform/virtual-ip/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!