计算机网络作业(二)
这次的作业是写一个程序查看所有的网卡信息,并列出ip地址,子网掩码,网关地址,最好加一个关闭和重启网卡的功能,修改网卡信息功能,由于技术时间有限只完成了基本功能。以后会开发完的
更新一:新增dns查询
开发环境说明
我的电脑系统是Win10 pro
开发环境是Visual Studio 2017
使用语言:基于C++的MFC开发
过程
新建一个MFC工程

更改文字的编码
我们需要多字节编码,不然的话不能使用汉语字符串

设置图形界面
我们需要2个Group box,一个Combo box,3个Edit Control和2个Button。两个Button一个用来初始化数据,一个用来根据网卡名来查询网卡信息。 图形界面如下所示:

设置关联变量
右键->类向导->成员变量->添加变量

添加combo变量

添加edit变量
gateway(网关)

像添加网关一样添加其他变量
编写代码
头文件
NetcardInfo.h添加
#include "resource.h" // 主符号#include <WinSock2.h>#include <Iphlpapi.h>#include <iostream>#pragma comment(lib, "IPHLPAPI.lib")#pragma comment(lib, "ws2_32.lib")using namespace std;
stdafx.h添加
xxxxxxxxxxextern CString cardname[10],ipaddress[10],ipmask[10],gateway[10];//显卡名,ip地址,子网掩码,网关extern int netCardNum;//网卡数量extern void start();//查看网卡信息函数eextern int dnsNum[10];extern void dnsget(int a);
正式代码
stdafx.app添加
xxxxxxxxxx//变量声明CString cardname[10],ipaddress[10],ipmask[10],gateway[10];int netCardNum = 0;int dnsNum[10];void dnsget(int a);void start();
NetcardInfo.app添加
xvoid start(){PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();//PIP_ADAPTER_INFO结构体指针存储本机网卡信息unsigned long stSize = sizeof(IP_ADAPTER_INFO); //得到结构体大小,用于GetAdaptersInfo参数int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量int IPnumPerNetCard = 0; //记录每张网卡上的IP地址数量if (ERROR_BUFFER_OVERFLOW == nRel){//如果函数返回的是ERROR_BUFFER_OVERFLOW//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小//这也是说明为什么stSize既是一个输入量也是一个输出量delete pIpAdapterInfo;//释放原来的内存空间pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];//重新申请内存空间用来存储所有网卡信息nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量}if (ERROR_SUCCESS == nRel){//输出网卡信息//可能有多网卡,因此通过循环去判断while (pIpAdapterInfo){cardname[netCardNum] = pIpAdapterInfo->Description;IP_ADDR_STRING pIpAddrString = &(pIpAdapterInfo->IpAddressList);ipaddress[netCardNum] = pIpAddrString->IpAddress.String;ipmask[netCardNum] = pIpAddrString->IpMask.String;gateway[netCardNum] = pIpAdapterInfo->GatewayList.IpAddress.String;pIpAdapterInfo = pIpAdapterInfo->Next;dnsget(netCardNum);netCardNum++;}}//释放内存空间if (pIpAdapterInfo){delete pIpAdapterInfo;}}
添加事件处理
初始化
xxxxxxxxxx//在BOOL CNetcardInfoDlg::OnInitDialog()函数中添加初始化事件m_combo_CardName.SetWindowText(“下拉选单选取网卡”);m_edit_ipaddress = “还没有选取网卡”;m_edit_ipmask = “还没有选取网卡”;m_edit_gateway = “还没有选取网卡”;m_edit_dnsadd1= “还没有选取网卡”;m_edit_dnsadd2 = “还没有选取网卡”;start();for (int i = 0; i < netCardNum; i++)m_combo_CardName.AddString(cardname[i]);
单击查询按钮事件
xxxxxxxxxxvoid CNetcardInfoDlg::OnBnClickedOk(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);CString str;m_combo_CardName.GetWindowText(str);//获取选择的网卡名字for (int i = 0; i<netCardNum; i++)if (str == cardname[i]){m_edit_gateway = gateway[i];m_edit_ipaddress = ipaddress[i];m_edit_ipmask = ipmask[i];if (dnsNum[i] == 2) {m_edit_dnsadd1 = dnsname1[i]; m_edit_dnsadd2 = dnsname2[i];}elseif (dnsNum[i] == 1) {m_edit_dnsadd1 = dnsname1[i]; m_edit_dnsadd2 = “第二个dns未设置”;}else{m_edit_dnsadd2 = “第二个dns未设置”; m_edit_dnsadd1 = “第一个dns未设置”;}break;}break;}UpdateData(false);}
dns查询功能 在Netcardinfo.app中添加
xxxxxxxxxxvoid dnsget(int netCardNum){FIXED_INFO FixedInfo; // 定义保存本地计算机网络参数信息的结构体指针ULONG ulOutBufLen; // 保存获取到的本地计算机网络参数信息结构体链表的长度DWORD dwRetVal; // 调用GetNetworkParams()函数的返回值IP_ADDR_STRING pIPAddr; // 保存所有DNS服务器的IP地址列表// 获取信息dnsNum[netCardNum] = 0;FixedInfo = (FIXED_INFO )GlobalAlloc(GPTR, sizeof(FIXED_INFO)); // 为FixedInfo结构体分配内存空间ulOutBufLen = sizeof(FIXED_INFO); // 初始化ulOutBufLen变量值// 第1次调用GetNetworkParams()函数,获取返回结果的大小到ulOutBufLen中if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, ulOutBufLen)) {GlobalFree(FixedInfo);FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, ulOutBufLen);}// 第2次调用GetNetworkParams()函数,以前面获取的ulOutBufLen作为参数,if (dwRetVal = GetNetworkParams(FixedInfo, ulOutBufLen) != ERROR_SUCCESS) {printf(调用GetNetworkParams()函数失败。返回值: %08x\n;, dwRetVal);}else {dnsname1[netCardNum] = FixedInfo->DnsServerList.IpAddress.String;pIPAddr = FixedInfo->DnsServerList.Next;dnsNum[netCardNum]++;while (pIPAddr) {dnsname2[netCardNum]= pIPAddr->IpAddress.String;pIPAddr = pIPAddr->Next;dnsNum[netCardNum]++;}}}
测试
效果如下
增加dns后效果如下

结论
以前写的程序都不用写界面,还好上次数据库上机学会了一点MFC编程,去网上查了一下获得网卡信息的方法,然后学着调用,然后在MFC上用全局变量储存得到的网卡信息,然后用数据库编程的基础加到了软件上,还好最后成功了。最后感谢巨硬给了这么好的软件,调试特别好用哈哈哈。
附件下载:google网盘
本地下载:NetcardInfo.rar
google blogger网页备份:链接
新增dns查询功能,重新打包
如果无法运行请安装vc++2017依赖库已经打包发布,不再需要
评论
发表评论