您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 实验一--Winsock编程接口实验
网络程序设计实验报告实验名称:winsock编程接口实验__________实验类型:验证型实验_________指导教师:贾浩___________________专业班级:信安0904_________________姓名:_谌军________________________学号:_20092036___________________电子邮件:_448149700@qq.com__________实验地点:_东六a座4--17______________实验日期:2012年3月11日实验成绩:__________________________二、实验设计(一)实验要求如下:1、编写程序能同时实现对多个域名的解析。比如在控制台输入:getip,能输出地址列表。2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址。(二)设计:1、要实现对域名的解析,最主要是对gethostbyname()函数的理解和应用。函数原型为:structhostent*gethostbyname(constchar*name);name为指向主机名的指针,它一般由函数gethostname返回。函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针,该结构格式如下:structhostent{charFAR*h_name;charFAR*FAR*h_aliases;shorth_addrtype;shorth_length;charFAR*FAR*h_addr_list;};由于已知主机名(即输入的域名),所以只要调用该函数就能得到ip地址列表。根据分析可得出程序流程图如下:2、要得到本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址等信息,主要是对GetAdaptersInfo()函数的理解和应用。该函数可以获取本地主机的所有适配器信息,并保存在pAdapterInfo所指向的链表中。函数原型为:DWORDGetAdaptersInfo(PIP_ADAPTER_INFOpAdapterInfo,//buffertoreceivedataPULONGpOutBufLen//sizeofdatareturned);IP_ADAPTER_INFO的定义如下:typedefstruct_IP_ADAPTER_INFO{struct_IP_ADAPTER_INFO*Next;DWORDComboIndex;charAdapterName[MAX_ADAPTER_NAME_LENGTH+4];charDescription[MAX_ADAPTER_DESCRIPTION_LENGTH+4];UINTAddressLength;BYTEAddress[MAX_ADAPTER_ADDRESS_LENGTH];DWORDIndex;Y开始输入域名,并存放在szHost[256]是否继续输入调用gethostbyname()函数,获得域名的IP将网络字符地址转化成点分十进制输出IP地址列表N结束UINTType;UINTDhcpEnabled;PIP_ADDR_STRINGCurrentIpAddress;IP_ADDR_STRINGIpAddressList;IP_ADDR_STRINGGatewayList;IP_ADDR_STRINGDhcpServer;BOOLHaveWins;IP_ADDR_STRINGPrimaryWinsServer;IP_ADDR_STRINGSecondaryWinsServer;time_tLeaseObtained;time_tLeaseExpires;}IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;通过调用该函数就可以得到所有适配器信息。流程图如下:三、实验过程(包含实验结果)1.实验步骤如下:(1)建立一个C++程序工程,并建立同名的C++文件;(2)将教材上获取本机IP等信息代码输入;(3)将::gethostname(szHost,256)改为cout”请输入主机名”endl;cinszHost;(4)为主函数中的所有代码加上while循环,从而实验多次域名的输入。(5)编译,调试,运行程序,检验程序运行结果。(6)思考,分析实验结果,编写实验报告。实验编译及链接错误:无。解决方案:无。输出信息调用GetAdaptersInfo函数,获得适配器信息为适配器申请内存开始结束实验结果:如下截图结果2.实验步骤如下:(1)建立名为LocalHostInfo的一个C++程序工程,并建立同名的文件;(2)将教材上获取本机ip地址,子网掩码,网关ip和本机MAC地址代码录入;(3)编译,调试,运行程序,检验程序运行结果。(4)思考,分析实验结果,编写实验报告。实验编译及链接错误:无。解决方案:无。实验结果:如下截图为运行程序后的结果:四、讨论与分析1)Winsock初始化的作用是什么?答:作用是为了式程序能够使用一些底层的API函数,用来完成功能2)给出GetAdaptersInfo()函数的正确使用方法DWORDGetAdaptersInfo(PIP_ADAPTER_INFOpAdapterInfo,//指向一个缓冲区,用来取得IP_ADAPTER_INFO结构的列表PULONGpOutBufLen//用来指定上面的缓冲区的大小,如果大小不够,此参数返回所需大小)//函数调用成功返回ERROR_SUCCESS3)域名解析时出现域名对应多个IP,请解释原因。因为一台主机上可能会对应多个IP地址如(笔记本上的无线网卡上对应了一个IP地址而在有线上也对应了一个IP地址)五、实验者自评(从实验设计、实验过程、对实验知识点的理解上给出客观公正的自我评价)这次实验使我对书本上的知识有了更深的理解,对于这些重要的API函数的调用也有了一个更加明确的理解,除此之外,我还对套接字、端口、IP地址之间的关系有了初步的理解,在以后的实验中,我会更加对书上的代码进行研究,充分的理解其中的关键要素!六、附录:关键代码(给出适当注释,可读性高)#includeWinsock2.h#includestdio.h#pragmacomment(lib,WS2_32)classCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmajorVer=2){//初始化WinsockWSADATAwsaData;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(::WSAStartup(sockVersion,&wsaData)!=0){exit(0);//初始化失败,退出程序}}~CInitSock(){::WSACleanup();//释放Winsock资源}};intmain(intargc,char**argv){CInitSockinitSock;charszHost[256];while(printf(输入域名:)){//通过域名得到地址信息scanf(%s,&szHost);if(szHost==0){break;}hostent*pHost=::gethostbyname(szHost);//打印出所有IP地址in_addraddr;for(inti=0;;i++){char*p=pHost-h_addr_list[i];if(p==NULL)break;memcpy(&addr.S_un.S_addr,p,pHost-h_length);char*szIp=::inet_ntoa(addr);printf(IP地址:%s\n,szIp);}}printf(\n);return0;}#includewindows.h#includestdio.h#includeIphlpapi.h#pragmacomment(lib,Iphlpapi.lib)#pragmacomment(lib,WS2_32.lib)///////////////////////////////////////////全局数据u_charg_ucLocalMac[6];//本地MAC地址DWORDg_dwGatewayIP;//网关IP地址////////////////////DWORDg_dwGatewayIP1;DWORDg_dwLocalIP;//本地IP地址DWORDg_dwMask;//子网掩码char*szAdapterName;char*szAdapterDescription;BOOLGetGlobalData(){PIP_ADAPTER_INFOpAdapterInfo=NULL;ULONGulLen=0;//为适配器结构申请内存::GetAdaptersInfo(pAdapterInfo,&ulLen);pAdapterInfo=(PIP_ADAPTER_INFO)::GlobalAlloc(GPTR,ulLen);//取得本地适配器结构信息if(::GetAdaptersInfo(pAdapterInfo,&ulLen)==ERROR_SUCCESS){if(pAdapterInfo!=NULL){memcpy(g_ucLocalMac,pAdapterInfo-Address,6);szAdapterName=pAdapterInfo-AdapterName;szAdapterDescription=pAdapterInfo-Description;g_dwGatewayIP=::inet_addr(pAdapterInfo-GatewayList.IpAddress.String);g_dwLocalIP=::inet_addr(pAdapterInfo-IpAddressList.IpAddress.String);g_dwMask=::inet_addr(pAdapterInfo-IpAddressList.IpMask.String);g_dwGatewayIP1=::inet_addr(pAdapterInfo-Next-IpAddressList.IpAddress.String);}}printf(\n--------------------本地主机信息-----------------------\n\n);in_addrin;in.S_un.S_addr=g_dwLocalIP;in_addrin1;in1.S_un.S_addr=g_dwGatewayIP1;printf(IPAddress:%s\n,::inet_ntoa(in));in.S_un.S_addr=g_dwMask;printf(SubnetMask:%s\n,::inet_ntoa(in));in.S_un.S_addr=g_dwGatewayIP;printf(DefaultGateway:%s\n,::inet_ntoa(in));u_char*p=g_ucLocalMac;printf(MACAddress:%02X-%02X-%02X-%02X-%02X-%02X\n,p[0],p[1],p[2],p[3],p[4],p[5]);printf(适配器名称:%s\n,szAdapterName);printf(适配器描述:%s\n,szAdapterDescription);/////////////////////////////printf(有线适配器ip地址:%s\n,inet_ntoa(in1));printf(\n\n);returnTRUE;}intmain(){//获取全局数据GetGlobalData();getchar();return0;}
本文标题:实验一--Winsock编程接口实验
链接地址:https://www.777doc.com/doc-5837910 .html