计算机网络作业(二)
这次的作业是写一个程序查看所有的网卡信息,并列出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添加
xxxxxxxxxx
extern 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]);
单击查询按钮事件
xxxxxxxxxx
void 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];
}
else
if (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中添加
xxxxxxxxxx
void 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依赖库已经打包发布,不再需要
评论
发表评论