当前位置:文档之家› 东南大学计算机网络实验报告一

东南大学计算机网络实验报告一

东南大学自动化学院实验报告课程名称:信息通信网络概论第1次实验实验名称:TCP/IP协议与Socket编程认识实验院(系):自动化专业:自动化姓名:学号:实验室:金智楼5楼实验组别:同组人员:实验时间:2016 年11 月29日评定成绩:审阅教师:目录一.实验目的和要求 (3)二.实验原理 (3)三. 实验方案与实验步骤 (5)四.实验设备与器材配置 (7)五.实验记录 (7)六.实验总结 (9)七.思考题或讨论题 (9)附录:部分代码一.实验目的和要求1)熟悉TCP/IP协议的功能和网络操作;2)了解基于SOCKET的编程原理;3)编写一个小型的Socket实用程序,初步了解Windows环境下使用Socket的编程。

二.实验原理1、什么是Windows Sockets规范?Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。

它不仅包含了人们所熟悉的Berkeley Socket 风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。

Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。

此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。

因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。

遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets兼容实现的提供者,我们称之为Windows Sockets提供者。

一个网络软件供应商必须百分之百地实现Windows Sockets规范才能做到现Windows Sockets兼容。

任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口。

我们称这种应用程序为Windows Sockets应用程序。

Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口. 应用程序调用Windows Sockets的API实现相互之间的通讯。

Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。

它们之间的关系如图1-1。

2、Winsock编程模型1)建立socket。

程序使用socket进行网络时,必须先建立一个socket。

为了建立一个socket,成需要调用socket函数。

例子:socket_handle=socket(protocol_family,_socket_type,protocol);2)配置一个socket。

为了配置一个,程序可使用Winsock API中不同的函数。

一般来讲,每个socket需要五种信息:本地和远地机的IP地址,本地和远地进程的协议端口,联接上使用的协议。

3)连接一个socket。

面向连接客户程序必须提供给Socket的唯一地址信息是远地主机信息—IP地址和协议端口。

4)使用一个Socket,程序能够使用Winsock API在一个配置好的Socket上传送和接收数据。

I/O函数如下:Send,通过连接的Socket传送数据,使用特殊的标志控制Socket 的行为。

Sendto,将数据传送给Socket地址结构指定的主机,传送时使用一个简单的报文缓冲区。

Recvfrom,从Socket接收数据,选择发送主机的网络地址,传送时使用一个简单的报文缓冲区。

5)使用一个连接的Socket。

由于Send函数不能指定目的地址,因此,程序只能在连接的Socket上使用它。

也就是说,在程序使用Send函数之前,必须建立一个Socket。

6)使用一个无连接的Socket。

当没有建立Socket连接时,上述的Send函数便不能使用,这是需要用Sendto函数。

三.实验方案与实验步骤(请绘制流程图)1、实验方案图3.1 实验步骤流程图图3.2 算法流程图2、实验步骤1)网络程序初始化,服务器和客户端WinSock API均要求在调用其他WinSock函数以前先调用WSAStartUp函数初始化。

2)创建套接字Socket()。

3)配置并启动套接字。

4)通过Socket发送和接收数据。

5)程序结束时必须关闭Socket,使用与WSAStartUp()相对应的函数WSACleanUp(),释放所分配的内部缓冲区和其他资源。

四.实验设备与器材配置电脑,VC6.0五.实验记录1、界面(1)输入为Url,输出为Ip,且显示IP地址类型;(2)输入为Ip,输出为Url;图5.1 设计界面2、功能描述(1)实现Url转换为Ip,即通过给定域名得到IP地址。

通过Gethostbyname()函数实现。

如图 5.2所示,输入域名,将得到IP地址为121.248.63.91。

(2)实现Ip转换为Url,即通过给定域名得到IP地址。

通过Gethostbya()函数实现。

输入上述得到的IP地址121.248.63.91,得到域名,可见一个IP地址可对应不同的域名。

图5.2 功能实现3、改进(1)判断当前IP地址的分类为A型、B型或C型。

通过判断32位二进制IP地址的网络号,若网络号在0~127之间,则为A类地址;若网络号在128~191之间,则为B类地址;若网络号在192~223之间,则为C类地址;若网络号在224~255之间,则为D类地址;其他为E类地址。

如图5.3所示,可以实现对不同IP地址的判断区分。

图5.3 判断IP地址类别六.实验总结通过本次学习,我对建立一个工程和搭接MFC界面有了非常深入的理解,能够自己设计界面并建立控件和函数直接的联系以及建立edit框和变量之间的联系。

理解并掌握了域名转换成IP、IP转换成域名的过程,能够运用相关函数gethostbyaddr()、Gethostbyname()、inet_addr()、inet_ntoa()实现两个转换过程,并在此基础上,通过判断32位IP地址的网络号判断出了该IP地址的类型,实现了改进。

对于IP 协议和Socket编程有了更加全面的认识,相信以后在遇到此类问题时能够得心应手的解决问题。

七.思考题或讨论题1.Chrome,IE,FireFox,safari四款浏览器核心评测对比。

(1)Chrome不易崩溃,反应速度快,搜索简单,标签灵活,安全性强。

目前网上支付还不支持chrome。

另外有些google服务被国内屏蔽,不能整合使用。

对那些不符合W3C标准的网站不能很好地显示,它只提供对标准的支持。

另外,有些网站(比如网银)采用了ActiveX技术,那是微软特有的技术,只在IE内核上能运行,所以谷歌浏览器支持不了。

它的自动同步功能和插件安装功能经常无法访问。

(2)IE浏览器系统自带的浏览器兼容性好,界面清新简洁。

但是长期以来没有太大的变化,功能中规中矩,安全漏洞不定时出现。

(3)FireFox可以自定义,可以修改连接速度,响应速度,可以修改内置参数,有许许多多的插件供你使用,可以支持各种下载工具,方便快捷。

应用范围很广,全世界性的。

但是会出现网页错位,浏览网页会出现结构不准确的情况,对在线媒体的支持不完美。

(4)Safari对弹出式广告的屏蔽很好。

但是无法自动新建标签页,对中文的支持还不够好,使用Safari自带的下载工具下载中文名的文件必定乱码。

无法与迅雷,快车等下载软件关联。

对比:(1)界面布局(2)内存占有率2.winsock和winlnet有哪些区别。

(1)winsockWinsock,工作于网络层和传输层的开发库,对于编写TCP,UDP,以及原始IP通信程序非常合适。

函数原形也基本符合Unix socket标准。

Windows平台上的大多数程序,如QQ,讯雷等都基于其开发。

(2)winInetWinInet,Windows Internet扩展库,工作于应用协议层,提供了http,ftp,gopher协议的实现,为基于以上三种协议的程序开发提供基础平台,需要说明的是,尽管WinInet工作于应用层,但其本身wininet.dll的实现并不依赖于winsock.dll或ws2_32.dll,而是独立存在的。

至少目前的版本是这样。

基于WinInet的应用程序最著名的例子就是IE了。

附录:(部分代码)1、URL转换IPvoid CMyDlg::OnOk1(){// TODO: Add your control notification handler code hereWSADATA wsaData;LPHOSTENT lpHostEnt;//该结构包含主机的ip;if(WSAStartup(0X0101,&wsaData))//若初始化成功则返回0;相当于应用程序与dll //之间的连接初始化,然后才能使用winsock api的函数MessageBox("Could not load windows sockets dll.",NULL,MB_OK|MB_ICONSTOP);else{UpdateData(TRUE);//用于将屏幕上控件中的数据交换到变量中。

//TODO: 此处需要自己添加函数,由对话框中输入的主机名m_Url1得到对应的包含主机ip的结构变量lpHostEnt//例如:输入的是,得到包含对应IP为11000000001000000100000000000010的结构变量lpHostEnt = gethostbyname(m_Url1);if(!lpHostEnt)MessageBox("Could not get ip address.",NULL,MB_OK|MB_ICONSTOP);else{DWORD addr;DWORD a;//TODO: 此处需要自己添加函数,把lpHostEnt结构中成员变量h_addr_list包含的网络位顺序的IPv4地址转化为常见的点间隔格式IP以供显示//例如:输入的是11000000001000000100000000000010,得到192.32.64.2m_Ip1 = inet_ntoa(*(LPIN_ADDR)*(lpHostEnt->h_addr_list));UpdateData(FALSE);//用于将数据在屏幕中对应控件中显示出来。

相关主题