毕业设计(论文)-基于ICMP模拟网络控制软件的开发控制管理模块.doc_第1页
毕业设计(论文)-基于ICMP模拟网络控制软件的开发控制管理模块.doc_第2页
毕业设计(论文)-基于ICMP模拟网络控制软件的开发控制管理模块.doc_第3页
毕业设计(论文)-基于ICMP模拟网络控制软件的开发控制管理模块.doc_第4页
毕业设计(论文)-基于ICMP模拟网络控制软件的开发控制管理模块.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕毕 业业 设设 计计( 论论 文文) 基于基于 ICMP 模拟网络控制软件的开发模拟网络控制软件的开发控制管理模块控制管理模块 论论文作者姓名:文作者姓名: 申申请请学位学位专业专业: : 申申请请学位学位类别类别: : 指指导导教教师师姓姓名名( (职职称称) ): : 论论文提交日期:文提交日期: 基于基于 ICMP 模拟网络控制软件的开发模拟网络控制软件的开发控制管理模块控制管理模块 摘摘 要要 随着网络技术的发展,网络通信已经越来越重要。而网络通信的实现,必 然离不开网络协议。网络协议是一套传递信息、管理信息的规则。通过这套规 则,计算机之间才能相互通信。目前,一些起到平台作用的通信协议已趋于完善, 如 TCP、UDP 和 ICMP 等。它们是以 IP 数据包为载体(IP 头+TCP/UDP/ICMP 头+ 数据)的。控制管理模块的主要目标是管理和发送控制信息,在 ICMP 协议的 基础上,模拟出一套自定义的规则,用于实现简单的网络控制。具体实现是通 过 VC 6.0 创建一个对话框工程,并采用 RAW SOCKET 技术完成 ICMP 数据包的发 送和接收,以 ICMP 的数据部分作为本协议实现的载体,即 IP 头+ICMP 头+数据 (自定义的简单协议)的数据包形式实现不同计算机之间的通信,从而达到网 络控制的目的。通过测试,该模块实现了控制信息的管理和发送。 关键词:关键词:ICMP;RAW SOCKET;网络协议;数据包 The Controlling and Management software module development of simulating network control based on ICMP Abstract With the advance of network technique, internet communication is becoming more and more important. However, it can not be realized without network protocol, which is a set of rules for transmitting and managing information. Through these rules, each computer can communicate with each other. At present, a lot of basal protocols have been nearly perfect, such as TCP、UDP、ICMP, which are based on the IP packets (IP head + TCP/UDP/ICMP head + data). The main task of Control Module is to manage and send the control information, which is to simulate a set of self user- defined rules and realize simple network control on the basic of ICMP protocol. The concrete realization is that we first establish a dialog-box project through VC 6.0, and then use RAW SOCKET technology to complete the sending and receiving of ICMP packets whose data part can be used as the carrier helping realize the protocol. It means that we can use the form of IP head + ICMP head + data (simple user-defined protocol) to realize the correspondence among different computers to achieve the goal of net-controlling. Through the test, the module has realized the management and transmission of control information. Key words:ICMP; RAW SOCKET; network protocol; data packet 目目 录录 论文总页数:24 页 1引言.1 1.1课题背景.1 1.2国内外研究现状.1 1.3本课题研究的意义.1 1.4本课题的研究方法.2 2TCP/IP 概述 .2 2.1概念.2 2.2TCP/IP 分层结构.2 2.3数据封装格式.3 3ICMP 概述 .4 3.1ICMP 介绍.4 3.2ICMP 报文格式.5 3.3ICMP 报文的类型.5 3.4ICMP 的重要性简介.7 4网络套接字.7 4.1套接字概述.7 4.2WINSOCK中的几个基本概念.9 4.2.1Winsock.9 4.2.2阻塞和非阻塞.9 4.2.3字节顺序.9 4.2.4客户机/服务器模型.9 4.3WINSOCK编程原理.10 4.3.1Winsock 的启动和终止 .10 4.3.2错误检查和控制.11 4.3.3Winsock 编程模型 .11 5控制协议的模拟实现.15 5.1课题的具体要求.15 5.2课题的实现重点.15 5.3可视化界面的具体实现.16 5.3.1思考过程.16 5.3.2几种控件的具体实现.16 5.4ICMP 类的核心实现.17 5.4.1在工程文件中插入 ICMP,编写 IP 和 ICMP 头结构 .17 5.4.2对 Winsock 进行初始化.18 5.4.3创建一个原始套接字,填充地址结构.18 5.4.4填充数据.19 5.4.5发送控制信息.19 5.5工程文件的组成.19 5.6控制协议的简单设计.19 5.7模拟环境.20 5.7.1硬件环境.20 5.7.2软件环境.20 5.8操作过程.20 结 论.22 参考文献.22 致 谢.23 声 明.24 第 1 页 共 24 页 1 1 引言引言 1.11.1 课题背景课题背景 随着科学技术的飞速发展,21 世纪的地球人已经生活在信息时代。20 世纪 人类两大科学技术成果计算机技术和网络技术,均已深入到人类社会的各个 领域,Internet 把“地球村”的居民紧密联系在一起, “天涯若比邻”已然成为 现实。互联网之所以能迅速蔓延,被世人接受,是因为它具备特有的信息来源。 近年来 Internet 的迅速发展,给人们的日常生活带来了全新的感受, “网络生存” 已经成为时尚,同时人类社会诸如政治、科研、经济、军事等各种活动对信息 网络的依赖程度已经越来越强, “网络经济”时代已初露端倪。 1.21.2 国内外研究现状国内外研究现状 Ping 命令早已是耳熟能详的检查网络畅通的得力方法之一,但是 ping 命令 是来自于哪个网络层次的哪个协议,就不是每个人能说得上的了。其实,ping 命令就是 ICMP 协议的一个重要应用,Traceroute 命令也是。ICMP 协议是一个 非常重要的协议,它对于网络安全、网络的正常运作具有极其重要的意义。它 被用于在 IP 主机、路由器之间传递控制消息,如网络通不通、主机是否可达、 路由是否可用等。这些控制信息虽然并不传输用户数据,但是对于用户数据的 传递起着重要的作用。而且,ICMP 协议本身的特点又决定了它非常容易被用 于攻击网络上的路由器和主机,造成 CPU 疲与奔命,系统瘫痪,主机死机。 1.31.3 本课题研究的意义本课题研究的意义 网络经济的发展自然离不开网络,而网络的发展更离不开网络协议。协议 本.质上是一套行为规则,这些规则也许是非书面形式的,但却是人们在使用中 认为是正确而接受的。由于环境和文化的原因,行为规则有些细微差别。有些 行为规则是写在纸上的,例如交通规则。但由于国家和地区的不同,交通规则 的差异也很大。例如,在中国,黄色交通信号意味着“当心,准备停车” 。但是 在德国,同样的黄色交通信号却表示“准备,灯就要变成绿色了” 。类似地,当 两台或更多台计算机需要通信时,它们也要有行为规则和书写与传送信息的习 惯。就像世界各地的人们在不同的地区讲不同的语言一样,计算机也需要“讲” 特定的网络语言即“协议” 。如果一个计算机不能使用某个协议,它就不能与使 用那个协议的计算机通信。 网络里面充斥着各种协议。一台计算机需要准确地知道信息在网络里以什 么形式传递,从而确保信息到达正确的地方。它需要知道网络预计的信息格式 (例如,信息的哪一部分是数据,哪一部分用于制定接收方的地址;只有这样, 网络才能将数据顺利地传递至目的地。就像上面提到的交通规则,我们可以称 之为十字路口的公路交通协议,这种协议可以确保车辆的安全通过。 第 2 页 共 24 页 1.41.4 本课题的研究方法本课题的研究方法 使用 VC 6.0,建立一个工程来实现 ICMP 数据包的发送和接收,用 ICMP 的 数据部分作为本协议实现的载体,即用 IP 头+ICMP 头+数据(自己设计的简单 协议)的数据包形式实现不同机器之间的网络通信而达到网络控制的目的。具 体的网络通信编程使用的是 raw socket 即原始套接字编程。 2 2TCP/IPTCP/IP 概述概述 2.12.1 概念概念 TCP/IP(Transmission Control Protocol/Internet Protocol 的简写,中文译名为 传输控制协议/互联网络协议)协议是 Internet 最基本的协议,简单地说,就是由 底层的 IP 协议和 TCP 协议组成的。 TCP/IP 是网络中使用的基本的通信协议。虽然从名字上看 TCP/IP 包括两 个协议,传输控制协议(TCP)和网际协议(IP),但 TCP/IP 实际上是一组协议,它 包括上百个各种功能的协议,常用的如:HTTP 协议、FTP 协议、TELNET 协 议等,而 TCP 协议和 IP 协议是保证数据完整传输的两个最基本的协议。通常 说的 TCP/IP 是 Internet 协议族,而不单单是 TCP 和 IP。 TCP/IP 是用于计算机通信的一组协议,我们通常称它为 TCP/IP 协议族。 它是 70 年代中期美国国防部为其 ARPANET 广域网开发的网络体系结构和协议 标准,以它为基础组建的 Internet 是目前国际上规模最大的计算机网络,正因为 Internet 的广泛应用,使得 TCP/IP 成了事实上的标准。 2.22.2 TCP/IPTCP/IP 分层结构分层结构 网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一 个协议族,比如 TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP 通常被 认为是一个四层协议系统,应用层,运输层,网络层,链路层。下面简单介绍 各层的主要功能和主要协议,它们的工作关系如图 2-1 所示。 1)链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的 设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其它任何 传输媒介)的物理接口细节。 2)网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的 选路。在 TCP/IP 协议族中,网络层协议包括 IP 协议,ICMP 协议,以及 IGMP 协议。 3)运输层主要为两台主机上的应用程序提供端到端的通信。在 TCP/IP 协议 族中,有两个互不相同的协议:TCP(传输控制协议)和 UDP(用户数据报协议)。 TCP 为两台主机提供可靠性的数据通信。它所做的工作包括把应用程序交 给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送 第 3 页 共 24 页 用户进程用户进程用户进程用户进程 TCPUDP IP ARP硬件接口RARP ICMPIGMP 传输层 应用层 网络层 链路层 图 2-1 TCP/IP 各层协议工作关系 最后确认分组的超时时钟等。由于运输层高可靠性的端到端的通信,因此应用 层可以忽略所有这些细节。而另一方面,UDP 则为应用层提供一种非常简单的 服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证 该数据报能达到另一端。任何必须的可靠性必须由应用层来负责。 4)应用层负责处理特定的应用程序细节。几乎各种不同的 TCP/IP 实现都会 提供下面这些通用的应用程序: Telnet 远程登陆;FTP 文件传输协议;SMTP 简单邮件传送协议;SNMP 简单网络管理协议。 2.32.3 数据封装格式数据封装格式 当应用程序用 TCP 传送数据时,数据被送入协议栈中,然后逐个通过每一 层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首 部信息。(有时还要增加尾部信息),该过程如图 2-2 所示。TCP 传给 IP 的数据单 元称作 TCP 报文段或简称为 TCP 段(TCP segment)。IP 传给网络接口层的数据 单元称作 IP 数据报(IP datagram)。通过以太网传输的比特流称作帧(Frame)。封 装过程如图 2-2 所示。 第 4 页 共 24 页 应用程序 IP TCP 以太网 驱动程序 以太网尾部以太网首部IP 首部TCP 首部应用数据 IP 首部TCP 首部应用数据 TCP 首部 用户 数据 应用数据 Appl 首部 用户 数据 以太网帧 图 2-2 数据进入协议栈时的封装过程 IP 数据报 TCP 段 以太网 3 3ICMPICMP 概述概述 3.13.1 ICMPICMP 介绍介绍 ICMP(Internet Control Message Protocol)Internet 控制报文协议是一个非常重 要的协议,它对于网络安全具有极其重要的意义。ICMP 消息是随 IP 数据报一 起传输的,但该消息本身也是与 IP 协议并行运行在网络层的协议。它是 TCP/IP 协议族的子协议,用于在 IP 主机、路由器之间传递控制消息。控制信 息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控 制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。它 传递差错报文以及其它需要注意的信息。 我们在网络中经常会使用到 ICMP 协议,只不过我们察觉不到而已。比如 我们经常使用的用于检查网络通不通的 Ping 命令,这个“Ping”的过程实际上 就是 ICMP 协议工作的过程。还有其它的网络命令如跟踪路由的 Tracert 命令也 是基于 ICMP 协议的。 第 5 页 共 24 页 3.23.2 ICMPICMP 报文格式报文格式 ICMP 报文是在 IP 数据报内被传输的如表 3-1 所示: 表 3-1 ICMP 封装在 IP 数据报内部 IP 首部ICMP 报文 ICMP 报文的格式如表 3-2 所示。所有报文的前四个字节都是一样的,但是 剩下的其它字节则互不相同。该消息使用了一种简单的数据结构,其报头部分 由 三个字段组成,作为报头第一项的类型(type)字段占用了一个字节,用来表示该 协议消息所实现的功能,而占用一个字节长度的代码(code)字段则用来进一步对 消息内容进行分类。报头最后一项是两个字节长度的校验和,检验和字段覆盖 整个 ICMP 报文,ICMP 的检验和是必需的。而其后的 ICMP 消息内容则与消息 功能有关,但所有消息内容中都必须带有引发错误消息和数据报的 IP 报头和前 8 个字节,而且这些信息足以使其上层协议对自己的报头进行检查并根据 ICMP 消息内容来执行适当的操作。最重要的是,ICMP 协议不支持数据纠错功能, 该协议只是通过数据源回送错误消息来告诉路由错误。 表 3-2 ICMP 报文 8 位类型 (1 字节) 8 位代码 (1 字节) 16 位校验和 (2 字节) 不同的类型和代码有不同的内容 3.33.3 ICMPICMP 报文的类型报文的类型 表 3-3 ICMP 报文类型 类 型代 码描述查 询差 错 0 0回显应答 3目的不可达 0网络不可达 1主机不可达 2协议不可达 3端口不可达 4需要进行分片但设置了不分片比特 5源站选路失败 6目的网络不认识 7目的主机不认识 第 6 页 共 24 页 8源主机被隔离 9目的网络被强制禁止 10目的主机被强制禁止 11由于服务类型 TOS,网络不可达 12由于服务类型 TOS,主机不可达 13由于过滤,通信被强制禁止 14主机选权 15优先权中止生效 40源端口关闭 5重定向 0对网络重定向 1对主机重定向 2对服务类型和网络重定向 3对服务类型和主机重定向 80请求回显 90路由器通告 100路由器请求 11超时 0传输期间生存时间为 0 1在数据报组装期间生存时间为 0 12参数问题 0 坏的 IP 首部 1缺少必须的选项 130时间戳请求 140时间戳应答 150信息请求 160信息应答 170地址掩码请求 180地址掩码应答 各种类型的 ICMP 报文如表 3-3 所示,不同类型由报文中的类型字段和代 码字段来共同决定。表中的最后两列表明 ICMP 报文是一份查询报文还是一份 差错报文。因为 ICMP 差错报文需要做特殊处理,因此需要对它们进行区分。 例如,在对 ICMP 差错报文进行响应时,永远不会生成另一份 ICMP 差错报文 (如果没有这个限制,可能会遇到一个差错产生另一个差错的情况,而差错再产 第 7 页 共 24 页 生差错,这样会无休止地循环下去)。 当发送一份 ICMP 差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错 报文的 IP 数据报的前 8 个字节。这样,接收 ICMP 差错报文的模块就会把它与 某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含 在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来 判断)联系起来。 下面各种情况都不会导致产生 ICMP 差错报文: 1)ICMP 差错报文(但是,ICMP 查询报文可能会产生 ICMP 差错报文)。 2)目的地址是广播地址或多播地址的 IP 数据报。 3)作为链路层广播的数据报。 4)不是 IP 分片的第一片。 5)源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回 地址、广播地址或多播地址。这些规则是为了防止过去允许 ICMP 差错报文广 播分组响应所带来的广播风暴。 3.43.4 ICMPICMP 的重要性简介的重要性简介 ICMP 协议对于网络安全具有极其重要的意义。ICMP 协议本身的特点决定 了它非常容易被用于攻击网络上的路由器和主机。例如,在 1999 年 8 月海信集 团“悬赏”50 万元人民币测试防火墙的过程中,其防火墙遭受到的 ICMP 攻击 达 334050 次之多,占整个攻击总数的 90%以上!可见,ICMP 的重要性绝不可 以忽视。比如,可以利用操作系统规定的 ICMP 数据包的最大尺寸不超过 64KB 这一规定,向主机发起“Ping of Death”(死亡之 Ping)攻击。 “Ping of Death” 攻击的原理是:如果 ICMP 数据包的尺寸超过 64KB 上限时,主机就会出现内 存分配错误,导致 TCP/IP 堆栈崩溃,致使主机死机。此外,向目标主机长时间、 连续、大量地发送 ICMP 数据包,也会最终使系统瘫痪。大量的 ICMP 数据包 会形成“ICMP”风暴,使得目标主机耗费大量的 CPU 资源,疲于奔命。 4 4网络套接字网络套接字 4.14.1 套接字概述套接字概述 网络通信是以套接字为基础的,一个套接字就是通信的一端。在通信的每 一端,都可以找到与其对应的一个套接字。每当一台主机要与另一台机器对话 时,它首先就要创建一对套接字,即使它正在使用着一对套接字与那台计算机 通信,因为这次又开始了一次新的对话。通常所说的网络通信,实际上是两台 计算机通过一对套接字相互传输数据的过程。一个正在被使用的套接字有着它 的类型与其相关的进程。最早使用套接字编程的是 Berkeley 分校的研究人员们, 他们在 UNIX 平台上开发了 Berkeley 套接字方案,使得通过这种接口能实现多 第 8 页 共 24 页 种网络协议之间的连接。 套接字可以根据通信任务的性质分类。用户可以觉察出它们的区别。应用 程序一般仅在同一类的套接字间通信。目前可以使用三种套接字,即流套接字、 数据报套接字和原始套接字。下面简单介绍三种套接字的特点。 1)流套接字,提供了双向的、有序的、无重复并且无记录边界的数据流服 务,它适用于处理大量数据。网络传输层可以将数据分散或集中到合适尺寸的 数据报中。 流套接字是面向连接的,通信双方进行数据交换之前,必须建立一条路径, 这样既确定了它们之间存在的路由,又保证了双方都是活动的、可彼此响应的, 但在通信双方之间建立一个通信信道需要很多开支。除此以外,大部分面向连 接的协议为保证发送无误,可能会需要执行额外的计算来验证正确性,因此会 进一步增加开销。 2)数据报套接字,支持双向的数据流,但并不保证数据是可靠、有序和无 重复的。也就是说,一个从数据报套接字中接收信息的进程有可能发现信息重 复或者和发出时的顺序不同。此外,数据报套接字的一个重要特点是它保留了 记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以 太网)非常类似的模型。 数据报套接字是无连接的,它不保证接收端是否正在侦听,类似与邮政服 务:发信人把信装入邮箱即可,至于收信人是否能收到这封信或邮局是否能按 时将信件投递到收信人处等,发信人都不得而知。因此,数据报并不可靠,需 由程序员负责管理数据报的排序和可靠性。 应用程序一般仅在同一类的套接口间通信,不过只要底层的通信协议允许, 不同类型的套接口间也照样可以通信。 3)原始套接字,从用户的角度看,SOCK_STREAM、SOCK_DGRAM 这两 类套接字似乎的确涵盖了 TCP/IP 应用的全部,因为基于 TCP/IP 的应用,从协 议栈的层次上讲,在传输层的确只可能建立于 TCP 或 UDP 协议之上,而 SOCK_STREAM、SOCK_DGRAM 又分别对应于 TCP 和 UDP,所以几乎所有 的应用都可以用这两类套接字实现。但是,当我们面对如下问题时, SOCK_STREAM、SOCK_DGRAM 将显得这样无助: (1)怎样发送一个自定义的 IP 包? (2)怎样发送一个 ICMP 协议包? (3)怎样分析所有经过网络的包,而不管这包是否是发给自己的? Raw Socket 与标准套接字(SCCK_STREAM、SOCK_DGRAM)的区别在于 前者直接置“根”与操作系统网络核心(Network Core),而 第 9 页 共 24 页 SOCK_STREAM、SOCK_DGRAM“悬浮”与 TCP 和 UDP 协议的外围。当我 们使用 Raw Socket 的时候,可以完全自定义 IP 包,一切形式的包都可以“制 造”出来。 4.24.2 WinsockWinsock 中的几个基本概念中的几个基本概念 .1 WinsockWinsock Windows 下网络编程的规范Windows Sockets 是得到广泛应用的、开放 的、支持多种协议的网络编程接口。该规范以 U.C.Berkeley 大学 BSD UNIX 中 流行的 Socket 接口为范例定义了一套 Microsoft Windows 下网络编程接口。它 不仅包含了人们所熟悉的 Berkeley Socket 风格的库函数,也包含了一组针对 Windows 的扩展函数,以使程序员能充分利用 Windows 消息驱动机制进行编程。 .2 阻塞和非阻塞阻塞和非阻塞 套接字可以处于阻塞或非阻塞模式。在阻塞模式下,在 I/O 操作完成前, 执行操作的 Winsock 函数会一直等待下去,不会立即返回(将控制权交还给程序), 直到操作完成。在非阻塞模式下,Winsock 函数无论如何都会立即返回并交出 程序的控制权,在默认情况下,套接字为阻塞模式。 .3 字节顺序字节顺序 不同的计算机有时使用不同的字节顺序存储数据。任何从 Winsock 函数对 IP 地址和端口号的引用和传送给 Winsock 函数的 IP 地址和端口号均是按照网络 顺序组织的,这也包括了 sockaddr_in 这一数据结构中的 IP 地址和端口号(但不 包括 sin family)。 .4 客户机客户机/服务器模型服务器模型 一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方 案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务 器间通信的非对称性。该模型工作时要求有一套为客户机和服务器所共识的惯 例,来保证服务能够被提供。这一套惯例包含了一套协议,它必须在通信的两 头都被实现。根据不同的情况,协议可能是对称的或是非对称的。在对称的协 议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认 为是主机,而另一方则是从机。一个对称协议的例子是 Internet 中用于终端仿真 的 Telnet。而非对称协议的例子是 Internet 中的 FTP。无论具体的协议是对称的 还是非对称的,当服务被提供时必然存在“客户进程”和“服务进程” 。 一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说, 第 10 页 共 24 页 服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。 在这个时刻,服务程序被“惊醒”并且为客户提供服务对客户的请求做出适 当的反应。 4.34.3 WinsockWinsock 编程原理编程原理 .1 WinsockWinsock 的启动和终止的启动和终止 由于 Winsock 的服务是以动态连接库 Winsock DLL 形式实现的,因此必须 先调用 WSAStartup 函数对 Winsock 进行初始化,协商 Winsock 的版本支持, 并分配必要的资源。如果在调用 Winsock 函数之前,没有加载 Winsock 库,则 会返回 SOCKET_ERROR 错误,错误信息是 WSANOTINITIALISED。 WSAStartup 函数原形如下: int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData); 其中 wVersionRequested 用于指定准备加载的 Winsock 库的版本,通常的做 法是高位字节指定所需要的 Winsock 库的副版本,而低位字节则是主版本,然 后,再用宏 MAKEWORD(X,Y)(X 是高位字节,Y 是低位字节)获得 wVersionRequested 的正确值。lpWSAData 参数是指向 LPWSADATA 结构的指 针,该结构包含了加载的库版本有关的信息,它的格式如下: Typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescription WSADESCRIPTION_LEN+1; char szSystemStatus WSASYS_STATUS_LEN+1; unsighed short iMaxSockets; unsighed short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA, *LPWSADATA; 其中,wVersion 字段为希望使用它们的 Winsock 版本。字段 wHighVersion 返回现有 Winsock 的最高版本。szDescription 和 szSystemStatus 这两个字段由特 定的 Winsock 实施方案设定,事实上没有用。字段 iMaxSockets 和 iMaxUdpDg 分别为可同时打开的套接字数和数据报的最大长度,一般不要使用它们,若想 知道数据报的最大长度则应该通过 WSAEnumProtocols 函数来查询协议信息, 而可同时打开套接字的最大数目不是固定的,它很大程度上和可用物理内存的 多少有关。最后一个字段 lpVendorInfo 是为 Winsock 实施方案有关的指定厂商 信息预留的,任何一个 Win32 平台上都没有使用这个字段。 此外,在应用程序关闭套接字后,还应调用 WSACleanup 函数终止对 第 11 页 共 24 页 Winsock DLL 的使用,并释放资源,以备下一次使用。WSACleanup 函数的原 形如下:int WSACleanup(void);该函数不带任何参数,若调用成功则返回 0, 否则返回错误。 4.3.2错误检查和控制错误检查和控制 错误检查和控制对于 Winsock 应用程序是至关重要的。事实上,对 Winsock API 函数来说,返回错误是常见的,但是多数情况下,通信仍可在套 接字上进行。 尽管返回错误的值并非一成不变,但不成功的 Winsock 调用返回 的最常见的值是 SOCKET_ERROR(值为-1 的常量)。如果错误情况发生了,就 可用 WSAGetLastError 函数来获得一段代码,这段代码明确地表明产生错误的 原因。该函数原形为: int WSAGetLastError(void); 该函数返回的错误都是预先声明的常量,根据 Winsock 版本的不同,这些 值的声明不在 Winsock 1.h 中,就会在 Winsock2.h 中。两个头字段的惟一差别 是 Winsock2.h 中包含的错误代码(针对 Winsock2.h 中引入的一些新的 API 函数)更 多。为各种错误代码声明的常量一般都以 WSAE 开头。 .3 WinsockWinsock 编程模型编程模型 不论是流套接字还是数据报套接字编程,一般都采用客户/服务器方式,它 们的运作过程基本类似,下面简单介绍两种基本的套接字编成模型。 (1) 数据报套接字编程模型。 数据报套接字编程的时序图如图 4-1 所示。 1.1)服务器进程创建套接字 服务进程总是先于客户进程启动,服务进程首先调用 socket 函数创建一个 套接字。socket 函数原形如下: SOCKET socket (int af, int type, int protocol); 其中,参数 af 用于指定网络地址类型,一般取 AF_INET,表示该套接字在 Internet 域中进行通信。参数 type 用于指定套接字类型,若取 SOCK_DGRAM 表示要创建的套接字是数据报套接字,若取 SOCK_RAW 表示要创建的套接字 是原始套接字。参数 protocol 用于指定网络协议,一般取 0,表示默认为 TCP/IP 协议,本课题指定协议为 IPPROTO_ICMP,表示创建一个将 ICMP 作为 一种基层 IP 协议的套接字。 1.2)将本地地址绑定到所创建的套接字上以便在网络上表示该套接字。 这个过程就是通过调用 bind 函数来完成的,该函数原形如下: int bind(SOCKET s, const struct sockaddr *name, int namelen); 第 12 页 共 24 页 其中,参数 s 表示一个未捆绑套接字描述符。参数 name 是赋予套接字的地 址,它由 struct sockaddr 结构表示,该结构的格式如下:struct sockaddru_short sa_family;char sa_data14;该地址结构随选择的协议的不同而变化,因此 一般情况下另一个与该地址结构大小相同的 sockaddr_in 结构更为常用, sockaddr_in 结构用来表示 TCP/IP 协议下的地址,在 TCP/IP 协议下,可以方便 地通过强制类型转换把 sockaddr_in 结构转换为 sockaddr 结构。Sockaddr_in 结 构的格式如下: Struct sockaddr_in short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin _zero 8; 其中,sin_family 字段必须为 AF_INET,表示该 socket 处于 Internet 域;参 数 in_port 和 sin_addr 用于指定端口和 IP 地址;字段 sin_ zero 只充当填充项, 以使 sockaddr_in 结构和 sockaddr 结构的长度一样。 1.3)等待接收数据 常用的接收数据的函数是 recvfrom,它的原型是: int recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from,int *fromlen); 其中,参数 s 是准备接收数据报的套接字,参数 buf 是即将收到数据的字 符缓冲区,参数 len 是准备接收的字节数或 buf 的长度。参数 flags 可以是 0、MSG_PEEK、MSG_OOB,0 表示无特殊行为,参数 from 是一个 sockaddr 结 构指针,参数 fromlen 是带有指向地址结构的长度的指针。 1.4)客户进程调用 socket 函数创建客户端套接字。 1.5)客户进程调用 bind 函数将本地地址绑定到所创建的套接字上。 1.6)客户进程发送数据 对于发送端的数据报套接字来说,也可以在创建套接字后,直接调用 sendto 函数,这是最简单的发送数据的方式,该函数原型为:int sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen );除了 buf 是发送数据的缓冲,len 指明发送的字节外,其余参数和 r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论