网络接口名称千奇百怪,而在更改网络设置却要经常用到。有没有可能用什么方法获取网络接口名称,然后输出到指定文件?我的思路如下:
1、使用命令netsh -c interface ip dump >interface.txt,把含有所有网络接口名称的网络配置文件输出到interface.txt中。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#========================
# IPv4 配置
#========================
pushd interface ipv4
reset
set global defaultcurhoplimit=64 icmpredirects=enabled taskoffload=enabled mldlevel= mldversion=
set interface interface="本地连接* 1" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="本地连接" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
popd
# IPv4 配置结束
|
2、通过查看interface.txt,我们会发现,只有网络连接的名称被双引号(”)包裹,而且一行最多只有一个网络接口名称。所以要获取网络接口名称,只需要截取每行的双引号中间的字符,然后将截取到的字符分行写入文件Network_interface_name.txt。
具体实现C++如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#include<iostream>
#include<fstream>
using
namespace
std;
//输出网络接口名称到 Network_interface_name.txt
int
main(
void
)
{
int
i , n,m = 0;
char
str[1024];
system
(
"netsh -c interface ip dump >interface.txt"
);
//输出含有所有网络接口名称的网络配置文件
ifstream in(
"interface.txt"
);
//读文件
ofstream out(
"Network_interface_name.txt"
);
while
(!in.eof())
//文件未结束,循环
{
in.getline(str,
sizeof
(str));
//读一行,将这一行的字符存放在str
if
(
strchr
(str,
'\"'
))
//判断str中是否含有”。如果有 ,继续。
{
while
(str[m] !=
'\"'
)
//m是第一个”的位置
{
m++;
}
n= m + 1;
while
(str[n] !=
'\"'
)
//n为第二个“的位置
{
n++;
}
for
(i = 0;i < n - m-1;i++)
{
str[i] = str[m + i + 1];
//将两个"包裹的字符(str[m+1]到str[n-1])依次赋值给str[0]到str[n-m-2]
}
str[n - m - 1] = 0;
//将str[n - m - 2]后的所有字符清0
out << str << endl;
cout<<str<<endl;
}
}
in.close();
out.close();
system
(
"interface.txt"
);
//打开命令netsh -c interface ip dump输出的网络配置文件interface.txt
system
(
"Network_interface_name.txt"
);
//打开储存网络接口名称的文件Network_interface_name.txt
}
|
3、分别查看网络配置文件interface.txt和储存网络接口名称的文件Network_interface_name.txt,发现这段C++代码可以完美实现。储存网络接口名称的文件Network_interface_name.txt如下:
1
2
|
本地连接* 1
本地连接
|
4、为了测试代码有没有存在BUG,我进行了一个简单的测试。
先将IP设置成静态IP。管理员身份运行CMD.exe,然后输出“netsh interface ip set address "本地连接"” static 192.167.1.122 255.255.255.0 192.167.1.1"。再运行代码。
输出interface.txt为:
#========================
# IPv4 配置
#========================
pushd interface ipv4
reset
set global defaultcurhoplimit=64 icmpredirects=enabled taskoffload=enabled mldlevel= mldversion=
add route prefix=0.0.0.0/0 interface="本地连接" nexthop=192.167.1.1 publish=是
set interface interface="本地连接* 1" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="本地连接" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
add address name="本地连接" address=192.167.1.122 mask=255.255.255.0
popd
# IPv4 配置结束
输出Network_interface_name.txt为:
本地连接
荙隥
荙隥
荙隥
出现了乱码,并不能正常显示。而且只有本来只有两个网络接口,显示了4个名称。
5、我再回头看代码。发现3个BUG:
一是读取文件前,m未归0,导致读取的时候并不是从str[0]开始读的。
二是如果网络连接名称出现有“,也只能读到名称的一部分,即名称中”前面的部分。
三是同一个网络连接名称,出现的次数不止一次。
6、发现bug后我对代码进行的修改:
a、在while循环前,让m归0。”while (str[m] != '\"')“前插一行:”m=0;“ 。
b、在找到第一个“后,从本行末向前读:初始n=strlen(str);循环时,n自减。
c、在interface.txt中,这段文字“set interface interface”后会出现每一个连接的名称,而且每个名称只会出现一次。只要读含有“set interface interface”的行,就能不重不漏的读到所含有网络接口名称。将"system("netsh -c interface ip dump >interface.txt");"改成"system("netsh -c interface ip dump|find \“set interface interface\”>interface.txt");"
修改后代码如下:
#include<iostream>
#include<fstream>
using namespace std;
//输出网络接口名称到 Network_interface_name.txt
int main(void)
{
int i , n,m = 0;
char str[1024];
system("netsh -c interface ip dump |find \"set interface interface\"> interface.txt");
ifstream in("interface.txt"); //读文件
ofstream out("Network_interface_name.txt");
while (!in.eof()) //文件未结束,循环
{
in.getline(str, sizeof(str),'\n'); //读一行,将这一行的字符存放在str
if (strchr(str, '\"')) //判断str中是否含有”。如果有 ,继续。
{
m=0;
while (str[m] != '\"') //m是第一个”的位置
{
m++;
}
n=strlen(str); //从本行的最末开始读
while (str[n] != '\"') //读到“停止。n为第二个“的位置
{
n--;
}
for (i = 0;i < n - m-1;i++)
{
str[i] = str[m + i + 1]; //将两个"包裹的字符(str[m+1]到str[n-1])依次赋值给str[0]到str[n-m-2]
}
str[n - m - 1] = 0; //将str[n - m - 2]后的所有字符清0
out << str << endl;
cout<<str<<endl;
}
}
in.close();
out.close();
system("interface.txt"); //打开 interface.txt
system("Network_interface_name.txt"); // 打开Network_interface_name.txt
}