.....v....州市职业大学实习(实训)报告名称实用网络程序设计实训2013年6月28日至2013年6月29日共1周院(部)计算机工程学院班级姓名学号院长李金祥系主任刘昭斌指导教师关辉于复生.....v....1、实训地点:信2-5062、实训时间:2013.6.28—2013.6.293、小组成员:4、具体内容:本地计算机信息的查询.....v....4.1程序设计分析与原理通过所学知识开发一个简单的查询工具,查询本机的基本配置信息以及基本网络配置,如计算机名、IP地址、MAC地址、网关、子网掩码等信息。利用Visio简单设计程序界面,方便用户查询操作。根据计算机相关信息的特点,如网络中IP地址的唯一性,MAC的唯一性等,可以使用相应函数直接获取信息,而对于子网掩码以及网关则需要先获得本地计算机的网络信息后才能获得子网掩码和网关的设置信息。主要原理功能介绍:A.查询本地计算机名和IP地址:为了在网络上区分不同的计算机,人们给每台计算机分配了一组用于标识该计算机的数字,称为IP地址。为了便于记忆,人们都希望使用主机名。可使用WinSock库提供的函数直接获得。流程图:开始初始化WinSock使用gethostname、gethostbyname函数获得本机主机名,以及IP地址信息显示主机名与IP地址信息关闭WinSock结束.....v....B.查询本机MAC地址:一个网卡对应唯一一个MAC地址,采用VC提供的NetBIOS网络编程接口可轻松获得。流程图:结束向网卡发送NCBASTAT命令获取网卡地址还有下一块网卡吗?吗??向网卡发送NCBRESET命令进行初始化取一个网卡获取网卡的数目、编号等信息列表调用Netbios,向网卡发送NCBENUM定义NCB结构在NCB结构中设置NCBENUM命令YesNo.....v....C.查询本机子网掩码:又称网络掩码。唯一作用是将某个IP地址划分成网络地址和主机地址。因此通过使用GetAdaptersInfo()获得本机网络信息后可得到子网掩码。流程图:获得子网掩码关闭开始引入头文件Iphlpapi.h,获得Iphlpapi.lib支持。使用GetAdaptersInfo()函数获得本地网络信息.....v....D.查询本机网关信息:又称网间连接器。使用GetAdaptersInfo()获得本机网络信息后可得到网关信息。流程图:获得子网掩码关闭开始引入头文件Iphlpapi.h,获得Iphlpapi.lib支持。使用GetAdaptersInfo()函数获得本地网络信息.....v....程序工程创建:(1).打开VS2005,创建工程选择MFC应用程序,如图1:图1选择MFC应用程序(2).选择“基本对话框”并取消“Unicode”库,默认创建完成。如图2:.....v....图2创建基本对话框(3).设计界面如图3:图3设计界面(4).创建如图1界面,并对列表框填加成员变量,如图4:图4添加成员变量.....v....A.4.2程序函数代码介绍A.“查询计算机名”按钮响应的函数源代码:voidCGetLocalDlg::OnBnClickedGetname(){WSADATAwsaData;intret;if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)return;charHostName[128];BOOLbRet;bRet=gethostname(HostName,128);//使用gethostname函数直接获取主机名if(bRet!=0){MessageBox(获取计算机名错误!,提示);return;}CStringstrMeg=HostName;strMeg=本机的计算机名是:+strMeg;m_show.InsertString(-1,strMeg);WSACleanup();}B.“查询IP地址”按钮响应的函数源代码:voidCGetLocalDlg::OnBnClickedGetip(){//TODO:在此添加控件通知处理程序代码WSADATAwsaData;intret;if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)return;charHostName[128];structhostent*pHost;gethostname(HostName,128);pHost=gethostbyname(HostName);inti=0;CStringstrIP;while(pHost-h_addr_list[i]!=NULL)//使用WinSock提供的函数库直接获得本机IP地址{strIP=inet_ntoa(*(structin_addr*)pHost-h_addr_list[i]);CStringstr=本机的IP地址:+strIP;.....v....m_show.InsertString(-1,str);i++;}WSACleanup();}C.“查询MAC地址”按钮响应的函数源代码voidCGetLocalDlg::OnBnClickedGetmac(){//TODO:在此添加控件通知处理程序代码NCBncb;//网络控制块LANA_ENUMlana_enum;//该结构包含网卡数目及其索引memset(&ncb,0,sizeof(ncb));//NCB结构清零ncb.ncb_command=NCBENUM;//向网卡发送NCBENUM命令,以获取当前计算机的网卡信息,//如有多少个网卡,每张网卡的编号等ncb.ncb_buffer=(unsignedchar*)&lana_enum;ncb.ncb_length=sizeof(lana_enum);UCHARuRetCode=Netbios(&ncb);intnum;//标识网卡个数MAC_ADDRESSmac_addr[5];//假设最多有5个网卡if(uRetCode!=0)return;num=lana_enum.length;//对每一张网卡,以其网卡编号为输入编号,获取其MAC地址for(inti=0;inum;i++){memset(&ncb,0,sizeof(ncb));//NCB结构重新清零ASTATAdapter;//对选定的网卡发送一个NCBRESET命令,以便进行初始化ncb.ncb_command=NCBRESET;ncb.ncb_lana_num=lana_enum.lana[i];uRetCode=Netbios(&ncb);//指定返回的信息存放的变量memset(&ncb,0,sizeof(ncb));ncb.ncb_command=NCBASTAT;.....v....ncb.ncb_lana_num=lana_enum.lana[i];//指定网卡号strcpy((char*)ncb.ncb_callname,*);ncb.ncb_buffer=(unsignedchar*)&Adapter;//指定返回的信息存放的变量Adapterncb.ncb_length=sizeof(Adapter);//接着,发送NCBASTAT命令以获取网卡的信息uRetCode=Netbios(&ncb);mac_addr[i].b1=Adapter.adapt.adapter_address[0];mac_addr[i].b2=Adapter.adapt.adapter_address[1];mac_addr[i].b3=Adapter.adapt.adapter_address[2];mac_addr[i].b4=Adapter.adapt.adapter_address[3];mac_addr[i].b5=Adapter.adapt.adapter_address[4];mac_addr[i].b6=Adapter.adapt.adapter_address[5];CStringstrMac;strMac.Format(第%d个MAC:%02X-%02X-%02X-%02X-%02X-%02X,i+1,mac_addr[i].b1,mac_addr[i].b2,mac_addr[i].b3,mac_addr[i].b4,mac_addr[i].b5,mac_addr[i].b6);m_show.InsertString(-1,strMac);}}.....v....D.“查询子网掩码”按钮响应的函数源代码voidCGetLocalDlg::OnBnClickedGetsubnet(){//TODO:在此添加控件通知处理程序代码PIP_ADAPTER_INFOpAdapterInfo;PIP_ADAPTER_INFOpAdapter=NULL;DWORDdwRetVal=0;pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));unsignedlongulOutBufLen=sizeof(IP_ADAPTER_INFO);//GetAdaptersInfo可以获得本地计算机的网络信息,从而获得该计算机的子网掩码。//该函数在头文件Iphlpapi.h.(需安装PlatformSDK)中声明,库文件Iphlpapi.lib。GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);//获得本地计算机的网络信息函数dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);pAdapter=pAdapterInfo;while(pAdapter){CStringstrSubNetMask;strSubNetMask.Format(子网掩码:%s\n,pAdapter-IpAddressList.IpMask.String);//MessageBox(strSubNetMask);m_show.InsertString(-1,strSubNetMask);pAdapter=pAdapter-Next;}return;}.....v....E.“查询网关”按钮响应的函数源代码voidCGetLocalDlg::OnBnClickedGetgetway(){//TODO:在此添加控件通知处理程序代码PIP_ADAPTER_INFOpAdapterInfo;PIP_ADAPTER_INFOpAdapter=NULL;DWORDdwRetVal=0;pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));unsignedlongulOutBufLen=sizeof(IP_ADAPTER_INFO);if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)!=ERROR_SUCCESS){GlobalFree(pAdapterInfo);pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);}//获得本地计算机的网络信息函数if((dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen))==NO_ERROR){pAdapter=pAdapterInfo;while(pAdapter){CStringstrGateway;strGateway.Format(网关:%s\n,pAdapter-GatewayList.IpAddress.String);m_show.InsertString(-1,strGateway);pAdapter=pAdapter-Next;}}else{MessageBox(CalltoGetAdaptersInfofailed!);}return;}.....v....4.3实训程序测试本机相关信息获取程序