C++实用网络编程设计完整版.pdf
苏苏 州州 市市 职职 业业 大大 学学实习(实训)任务书实习(实训)任务书名称:实用网络程序设计实训起讫时间:2012-6-11 至 2012-6-15院系:计算机工程系班级:10 系统集成指导教师:于复生吴建平系 主 任:李金祥第 1 页 共 18 页一、实习(实训)目的和要求通过实训,进一步掌握网络编程的知识和技能,掌握解决实际问题以及进行一定网络程序设计的能力。实训注重网络程序的细节技术,进一步研究网络编程函数和相关 MFC 类,并且着重解决编程中可能存在的问题和难点,同时将这些知识应用于实际开发中,利用理论知识指导实践的开发。第 2 页 共 18 页二、实习(实训)内容1、文件传输的设计2、聊天软件的设计3、广播程序的设计4、本地计算机信息的查询5、局域网信息的查询学生按班级内序号分组,每 5 位同学一组,每人完成一个项目。三、实习(实训)方式 集中 分散 校内 校外第 3 页 共 18 页四、实习(实训)具体安排以小组为单位,每个小组 5 台计算机,计算机之间通过局域网连接。共同完成小组任务,并完成调试。序号123456教学内容题目文件传输的分析与设计聊天软件的分析与设计广播程序的分析与设计本地计算机信息的查询局域网信息的查询项目整体测试合计44444424学 时 分 配小计讲课112实训34444322五、实习(实训)报告内容(有指导书的可省略)1、实训地点:信 2-5062、实训时间:2012/06/112012/06/153、小组成员:XXXXXXXXXXX4、具体内容:本地计算机信息的查询5、实训总结:第 4 页 共 18 页苏苏 州州 市市 职职 业业 大大 学学实习(实训)报告实习(实训)报告名称实用网络程序设计实训2012 年 6 月 11 日至 2012 年 6 月 15 日共一周院系计算机工程系班级10 系统集成姓名XXXXX系主任李金祥教研室主任谭方勇指 导 教 师于 复 生吴 建 平第 5 页 共 18 页1、实训地点:信 2-5062、实训时间:2012/06/112012/06/153、小组成员:XXXXXXXXXX4、具体内容:本地计算机信息的查询4.14.1 设计分析与原理设计分析与原理(1)获取主机名和 IP 地址:获取本地计算机名和 IP 地址可以通过读注册表获得,也可以使用 winsock 库提供的相关函数来实现。(2)获取计算机软硬件配置信息:获取本机的操作系统信息和 CPU 信息需要查询注册表,从注册表中读取所需要的信息,然后显示到界面上。(3)查询本地网卡地址:一个网关对应唯一一个的 MAC 地址,对一些应用程序来说,获取网卡 MAC 地址有时是必要的,使用 VC 提供的 NetBIOS网络编程接口可以方便获取网卡 MAC 地址(4)查询本机子网掩码:函数 GetAdaptersInfo()可以获得本地计算机的网络信息,从而获得该计算机的子网掩码,该函数的头文件 Iphlpai.h 中定义,需要从 Iphlpai.lib 的支持。VC 里面没有这两个,所以要从网络上下载他们。(5)查询本机网关:函数 GetAdaptersInfo()可以获得本地计算机的网络信息,从而获得该计算机的网关设置,该函数的头文件 Iphlpai.h 中定义,需要从Iphlpai.lib 的支持。VC 里面没有这两个,所以要从网络上下载他们。(6)查询本机 DNS:函数 GetNetworkParams()可以获得本地计算机的网络参数,从而获得该计算机的DNS 设置,该函数的头文件Iphlpai.h 中定义,需要从 Iphlpai.lib 的支持。VC 里面没有这两个,所以要从网络上下载他们。第 6 页 共 18 页4.24.2 程序流程图程序流程图图 1 操作注册表的流程图 2 获取 MAC 地址流程第 7 页 共 18 页4.34.3 程序代码程序代码void CMyDlg:OnGetname()/初始化 WinSock为 2.0 版本WSADATA wsaData;int ret;if(ret=WSAStartup(MAKEWORD(2,2),&wsaData)!=0)return;char HostName128;BOOL bRet;bRet=gethostname(HostName,128);if(bRet!=0)MessageBox(获取计算机名错误!,提示);return;CString strMeg=HostName;strMeg=本机的计算机名是:+strMeg;m_show.InsertString(-1,strMeg);WSACleanup();/TODO:Add your control notification handler code herevoid CMyDlg:OnGetip()/初始化 WinSock为 2.0 版本WSADATA wsaData;int ret;if(ret=WSAStartup(MAKEWORD(2,2),&wsaData)!=0)return;char HostName128;struct hostent*pHost;gethostname(HostName,128);pHost=gethostbyname(HostName);int i=0;CString strIP;while(pHost-h_addr_listi!=NULL)strIP=inet_ntoa(*(struct in_addr*)pHost-h_addr_listi);第 8 页 共 18 页CString str=本机的 IP 地址:+strIP;m_show.InsertString(-1,str);i+;WSACleanup();/TODO:Add your control notification handler code herevoid CMyDlg:OnSoft()CString strPath=SOFTWAREMicrosoftWindowsCurrentVersion;/注册表子键路径CRegKey regkey;/定义注册表类对象LONG lResult;/LONG 型变量反应结果char strMes50;CString strShow;DWORD dwSize=50;lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);/打 开注册表键if(lResult!=ERROR_SUCCESS)AfxMessageBox(错误:无法查询有关的注册表信息);return;/获取操作系统安装序列号值memset(strMes,0,50);regkey.QueryValue(strMes,ProductId,&dwSize);strShow=strMes;strShow=操作系统安装序列号:+strShow;m_show.InsertString(-1,strShow);regkey.Close();/关闭注册表/获取操作系统名称、Windows的版本号和 windows 的版本名称strPath=SOFTWAREMicrosoftWindows NTCurrentVersion;/注册表子键路径lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);/打 开注册表键if(lResult!=ERROR_SUCCESS)第 9 页 共 18 页AfxMessageBox(错误:无法查询有关的注册表信息);return;/获取操作系统名称memset(strMes,0,50);regkey.QueryValue(strMes,ProductName,&dwSize);strShow=strMes;strShow=操作系统名称:+strShow;m_show.AddString(strShow);/获取 windows 的版本名称memset(strMes,0,50);regkey.QueryValue(strMes,CSDVersion,&dwSize);strShow=strMes;strShow=Windows的版本名称:+strShow;m_show.AddString(strShow);/获取 Windows的版本号memset(strMes,0,50);regkey.QueryValue(strMes,CurrentVersion,&dwSize);strShow=strMes;strShow=Windows的版本号:+strShow;m_show.AddString(strShow);regkey.Close();/关闭注册表void CMyDlg:OnHard()CString strPath=HARDWAREDESCRIPTIONSystemCentralProcessor0;/注册表子键路径CRegKey regkey;/定义注册表类对象LONG lResult;/LONG 型变量反应结果lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS);/打 开注册表键if(lResult!=ERROR_SUCCESS)AfxMessageBox(错误:无法查询有关的注册表信息);return;char strMes50;DWORD dwSize=50;CString strShow;/获取 CPU 名称regkey.QueryValue(strMes,ProcessorNameString,&dwSize);strShow=strMes;strShow=CPU 名称:+strShow;m_show.AddString(strShow);第 10 页 共 18 页/获取 CPU 标识regkey.QueryValue(strMes,Identifier,&dwSize);strShow=strMes;strShow=CPU 标识:+strShow;m_show.AddString(strShow);/获取 CPU 制造商regkey.QueryValue(strMes,VendorIdentifier,&dwSize);strShow=strMes;strShow=CPU 制造商:+strShow;m_show.AddString(strShow);/获取 CPU 主频regkey.QueryValue(dwSize,MHz);strShow.Format(%d,dwSize);strShow=CPU 主频:+strShow;m_show.AddString(strShow);regkey.Close();/关闭注册表void CMyDlg:OnGetmac()NCB ncb;/网络控制块LANA_ENUM lana_enum;/该结构包含网卡数目及其索引memset(&ncb,0,sizeof(ncb);/NCB 结构清零ncb.ncb_command=NCBENUM;/向网卡发送 NCBENUM 命令,以获取当前计算机的网卡信息,/如有多少个网卡,每张网卡的编号等ncb.ncb_buffer=(unsigned char*)&lana_enum;ncb.ncb_length=sizeof(lana_enum);UCHAR uRetCode=Netbios(&ncb);int num;/标识网卡个数MAC_ADDRESSmac_addr5;/假设最多有 5 个网卡if(uRetCode!=0)return;num=lana_enum.length;/对每一张网卡,以其网卡编号为输入编号,获取其 MAC 地址for(int i=0;i IpAddressList.IpMask.String);MessageBox(strSubNetMask);pAdapter=pAdapter-Next;void CMyDlg:OnBnclickedgetgateway()PIP_ADAPTER_INFO pAdapterInfo;PIP_ADAPTER_INFO pAdapter=NULL;DWORD dwRetVal=0;pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO);unsigned long ulOutBufLen=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)CString strGateway;strGateway.Format(网关:%sn,pAdapter-GatewayList.IpAddress.String);MessageBox(strGateway);pAdapter=pAdapter-Next;else第 13 页 共 18 页MessageBox(Call to GetAdaptersInfo failed!);return;void CMyDlg:OnBnclickedgetdns()FIXED_INFO*FixedInfo;ULONGulOutBufLen;DWORDdwRetVal;IP_ADDR_STRING*pIPAddr;FixedInfo=(FIXED_INFO*)GlobalAlloc(GPTR,sizeof(FIXED_INFO);ulOutBufLen=sizeof(FIXED_INFO);/函数 GetNetworkParams 可以获得本地计算机的网络参数,从而获得计算机的DNS 设置if(ERROR_BUFFER_OVERFLOW=GetNetworkParams(FixedInfo,&ulOutBufLen)GlobalFree(FixedInfo);FixedInfo=(FIXED_INFO*)GlobalAlloc(GPTR,ulOutBufLen);if(dwRetVal=GetNetworkParams(FixedInfo,&ulOutBufLen)printf(Call to GetNetworkParams failed.Return Value:%08xn,dwRetVal);elseCString strDNS;strDNS.Format(首先 DNS 服务器:%s,FixedInfo-DnsServerList.IpAddress.String);MessageBox(strDNS);pIPAddr=FixedInfo-DnsServerList.Next;while(pIPAddr)CString strIPAddr;strIPAddr.Format(备选 DNS 服务器:%s,pIPAddr-IpAddress.String);MessageBox(strIPAddr);pIPAddr=pIPAddr-Next;return;第 14 页 共 18 页4.44.4 程序运行界面及程序运行结果程序运行界面及程序运行结果(截图并文字说明)图 1 程序运行界面图 2 主机名和 IP 运行结果第 15 页 共 18 页图 3 操作系统、CPU 和 MAC 地址运行结果图子网掩码运行结果第 16 页 共 18 页图网关运行结果图DNS 运行结果第 17 页 共 18 页5 5、实验总结:、实验总结:经过本次实训,我们对 Visual C+的网络编程能力有了一个质的飞跃,对 VC 这个软件更加了解;更加熟悉了在 VC 里面编程;对 C+的语法等方面有了更深的了解;对以后的学习生活有很大的帮助。我做的具体内容是本地计算机信息的查询,其中包括:获取主机名和IP 地址,获取计算机软硬件配置信息,查询本地网卡地址,查询本地子网掩码。在实验的过程中,我遇到了一些难题,有的靠自己在网络上找资料解决的,有的和同学讨论解决的,有的在老师的帮助下解决的。在最终,圆满的完成了实训的任务。第 18 页 共 18 页