网络接口名称输出到文件的C++实现




   
    网络接口名称千奇百怪,而在更改网络设置却要经常用到。有没有可能用什么方法获取网络接口名称,然后输出到指定文件?我的思路如下:
1、使用命令netsh -c interface ip dump >interface.txt,把含有所有网络接口名称的网络配置文件输出到interface.txt中。
Plain Text code
?
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++如下:
C/C++ code
?
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如下:
Plain Text code
?
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 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值