1东南大学自动化学院实验报告课程名称:信息通信网络概论第1次实验实验名称:TCP/IP协议与Socket编程认识实验院(系):自动化专业:自动化姓名:施恺然学号:08013425实验室:金智楼实验组别:无同组人员:无实验时间:2015年12月6日评定成绩:审阅教师:2目录一.实验目的和要求…………………………………………………3二.实验原理…………………………………………………………3三.实验方案与实验步骤……………………………………………4四.实验设备与器材配置……………………………………………4五.实验记录…………………………………………………………4六.实验总结…………………………………………………………5七.思考题或讨论题…………………………………………………7(要求:给出一级目录,宋体加粗,四号字,1.5倍行距。)3(报告正文部分的格式):(要求:正文部分一律用五号字,宋体,单倍行距。一级大标题靠左,四号,宋体,加粗。二级大标题靠左,小四,宋体,不加粗。)实验报告内容:一.实验目的和要求实验目的:1)学习使用MFC制作界面2)学会利用已有函数添加进入MFC内容中3)了解学习DNS域名解析协议的机制实验要求1)使用MFC制作一个界面2)将已给函数的语法与原理解释清楚3)将已给函数中的特定固有函数解释清楚二.实验原理1)MFC的制作:微软基础类库(英语:MicrosoftFoundationClasses,简称MFC)是一个微软公司提供的类库(classlibraries),以C++类的形式封装了WindowsAPI,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。2)Gethostbyaddr函数Gethostbyaddr函数的基本作用就是通过已知的域名获得该域名对应的IP地址。其原理就是DNS域名解析协议。函数返回对应于给定地址的包含主机名字和地址信息的hostent结构指针。也就是说返回的是一个包含关于给定地址详细信息的指针,通过解析指针内容可以获得想要主机信息。3)Gethostbyname函数Gethostbyname函数也是通过DNS服务的获得IP对应的域名。其返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。可以发现该函数获得的返回信息与Gethostbyaddr函数返回信息是一样的。如果说上一个函数(Gethostbyaddr)使用了DNS协议通过域名寻找到相应的IP地址的话,该函数就是通过DNS服务发送IP地址直接请求相应的详细信息,较上一个函数少了一步通过域名请求IP地址的步骤。4)inet_addr函数inet_addr函数是一个格式转换函数。返回:若字符串有效则将字符串转换为32位二进制网络字节序的IPV4地址,否则为INADDR_NONE。例:已有地址127.0.0.1转换为32位二进制地址为:inet_addr(127.0.0.1)会返回:01111111.00000000.00000000.00000001地址。5)inet_ntoa函数inet_ntoa函数4inet_ntoa函数同上一个函数一样也是格式转换函数,与inet_addr函数不同,本函数是将二进制地址转换成字符串地址。6)WSAStartup函数使用Socket的程序在使用Socket之前必须调用WSAStartup函数。7)WSACleanup函数应用程序或DLL在使用WindowsSockets服务之前必须要进行一次成功的WSAStartup()调用.当它完成了WindowsSockets的使用后,应用程序或DLL必须调用WSACleanup()将其从WindowsSockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源。三.实验方案与实验步骤1)建立MFC界面鉴于MFC的制作是体力型劳动,就不一一讲解建立过程。2)先在MFC的URL文本框中输入域名,点击确定。然后下方文本框会出现相对应的IP地址。3)再在IP地址文本框中输入刚才得到的IP地址,点击确定。会获得响应域名。四.实验设备与器材配置1)PC机一台2)VC6.0编译工具五.实验记录(自行设计记录方式)当输入cc.seu.edu.cn时返回58.192.114.222的IP地址;将地址复制粘贴到另一个输入栏中,返回相同的域名。5当输入地址。地址至复制到粘贴到另一个输入栏中,返回不相同的域名:wpidc91.seu.edu.cn。将wpidc91.seu.edu.cn重新输入URL中,获得的IP地址与是相同。从结果看:不同域名的对应同一个IP,不同IP地址会有不同的域名。六.实验总结(包括实验数据处理、实验结果分析讨论等)上诉的现象可以从程序中得到解释。程序解析:(这是从域名获得IP地址的程序)if(WSAStartup(0X0101,&wsaData))MessageBox(Couldnotloadwindowssocketsdll.,NULL,MB_OK|MB_ICONSTOP);首先调用windowssockets服务,如果服务调用不可用会返回:“Couldnotloadwindowssocketsdll.”的文本框。如果成功调用则会继续下述过程。else{UpdateData(TRUE);MFC下载文本框数据。lpHostEnt=gethostbyname(m_Url1);下载文本数据名为m_Url1,m_Url1是域名信息。使用gethostbyname将hostent结构指针信息从服务器上全部下载下来。hostent结构指针中有大量有关主机的信息。如果没有加载成功,lpHostEnt将会置为零。if(!lpHostEnt)MessageBox(Couldnotgetipaddress.,NULL,MB_OK|MB_ICONSTOP);else为零则会跳出文本框“Couldnotgetipaddress.”非零则会执行下述操作{m_Ip1=inet_ntoa(*(LPIN_ADDR)*(lpHostEnt-h_addr_list));UpdateData(FALSE);}6}m_Ip1为取得的IP地址,程序中lpHostEnt-h_addr_list为将lpHostEnt中的域名列表取出,*(LPIN_ADDR)是将取出列表强制传换格式以供inet_ntoa函数转换为平时可读的地址。(h_addr_list:应该以空指针结尾的主机地址列表,返回的地址是以网络顺序排列的)UpdateData(FALSE)以降得出信息上载到MFC界面中WSACleanup();结束服务,释放资源。\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(这是从IP获得域名的程序)前述加载程序不一一赘述UpdateData(TRUE);MFC下载文本框数据。dwIPAddr=inet_addr(m_Ip2);将IP地址转换为32位个数,并赋予dwIPAddrif(dwIPAddr==INADDR_NONE)MessageBox(InvalidInternetAddress.,NULL,MB_OK|MB_ICONSTOP);else如果dwIPAddr是十进制格式255.255.255.255;二进制格式:11111111.11111111.11111111.11111111;这是计算机广播地址,不给予下续程序进行。{lpHostEnt=gethostbyaddr((LPSTR)&dwIPAddr,4,PF_INET);下载数据名为dwIPAddr,dwIPAddr是IP二进制地址信息。使用gethostbyaddr将hostent结构指针信息从服务器上全部下载下来。hostent结构指针中有大量有关主机的信息。如果没有加载成功,lpHostEnt将会置为零。if(!lpHostEnt)MessageBox(Couldnotgethostname.,NULL,MB_OK|MB_ICONSTOP);为零则会跳出文本框“Couldnotgetipaddress.”非零则会执行下述操作else{m_Url2=lpHostEnt-h_name;UpdateData(FALSE);将lpHostEnt的域名信息取出赋予m_Url2,h_name是正规的主机名字(PC)。一个IP有多个域名也就是这里的原因。返回的h_name不一定是平时用的域名,也就是一个IP可以对应多个域名。}}WSACleanup();结束服务,释放资源。7七.思考题或讨论题1.WinInet有什么作用?答:wininet提供了多种协议,比如http,ftp。平时还是winhttp,它只提供http协议,和wininet的功能重复,但是更稳定。2.结合本次实验,谈谈使用MFCWinInet类有哪些优点?答:内置函数丰富且成熟。协议内容已经封装到函数中,也就是不用调试协议内容,就可以通过已有函数进行程序编写,大大方便程序的设计。