




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浙江工商大学毕业设计(毕业论文)学 院 信息与电子工程学院 专 业 通信工程 学生姓名 王卡兰 学 号 01222104 指导教师 董黎刚 二OO五年六月总 目 录一、 正文1二、 指导教师评语30三、 答辩委员会评语及设计(论文)成绩31四、 文献综述32五、 文献综述导师评语36六、 外文翻译37七、 外文翻译导师评语41八、 设计(论文)相关材料42正 文 目 录摘要4关键词4Abstract4Keyword4第一章 绪论51.1 背景介绍51.2 要解决的问题61.3目的意义61.4 论文结构7第二章 关键技术72.1 VC+72.2 Socket 编程原理92.2.1 进程通信92.2.2 服务方式112.2.3 客户/服务器模式122.2.4 套接字类型132.2.5 基本套接字系统调用14第三章 程序实现和演示183.1 在VC+ 6.0 中新建工程183.2 菜单栏的实现193.3 FE与CE之间通信的实现223.4 即时信息框的实现28第四章 经验总结与体会30参考文献31开放可编程网络控制件和转发件之间通信的初步实现王卡兰(通信011 学号01222104)摘要:本次毕业设计的主要内容是用VC+编程及Socket 编程实现开放可编程网络中控制件和转发件的通信及即时信息框。围绕这个目标,本文首先介绍支持转发和控制件分离(ForCES)的IP QoS路由器技术研究,然后介绍Socket 编程和VC+ 6.0 开发工具及其主框架的实现,接着具体描述开放可编程网络中控制件和转发件的通信和即时信息框的实现,最后是本人在这次毕业设计过程中的一些经验总结和体会。关键词:转发和控制件分离 套接字编程 通信 即时信息框Abstract: The main content of this diploma project is to realize the communication between control elements and forwarding elements and instant information box in open programmable networks. In this thesis, the basic technology of IP QoS routers supporting Forwarding and Control Separation (ForCES) is introduced firstly. Secondly, I introduce the VC +6.0 development tool, socket programming, and the implementation of the main frame. Thirdly, I present the implementation of communication between control elements and forwarding elements and the instant information box. Finally, I summarize the work in this graduation project.Keyword: ForCES, socket programming, communication,the instant information box第一章 绪论1.1 背景介绍转发和控制分离(Forwarding and Control Separation,ForCES)2 是IETF 路由领域(Routing Area)的一个工作组,它专门研究开放编程的IP路由器的体系结构和协议问题,是当前开放可编程网络研究最受关注的研究组织。ForCES基本思想是把IP路由器分成转发件(Forwarding Elements,FE)2和控制件(Control Elements,CE), 认为IP路由器可由多个(可达几百个)FE、多个CE和连接他们的ForCES协议构成。当前IETF ForCES工作组已经完成了ForCES需求(ForCES Requirements, RFC3654)4和基本完成了ForCES框架。通用路由器管理协议(General Router Management Protocol (GRMP))是我们所提交给IETF ForCES工作组的互联网草案(Internet-Draft) 。它作为三个ForCES的候选协议之一,已和另外两个候选协议(FACT and Netlink2)一起初步合并成正式的ForCES协议。ForCES体系结构和模型主要在ForCES Requirements (RFC3654)和 ForCES Framework中定义。一个满足ForCES标准的网络组件(Network Element,NE) 其核心具有如下图所示结构。Fi/fFi/fFi/fForCES NEFiForCES协议FP参考点Fi/fFi/fFi/fFEnFE2FE1FrCE2CE1图中,一个ForCES NE内有至少一个或多个冗余用的控制件CE、有可多达几百个的转发件FE,它们间的联系通过ForCES协议完成,这个连接面称为Fp参考点。Fi/f为各个FE的网络接口参考点; Fr为冗余CE连接参考点,当前ForCES暂不考虑该点的技术问题。 FE内的体系结构主要由FE模型定义,FE基本结构如下图所示 。FP参考点CEFE SlaveFE ModelLFB1FEForCES协议终端点数据通道LFBn图2. ForCES FE基本结构其中FE内QoS资源模块的描述统一标称为ForCES FE 逻辑功能块LFB,LFB及它的属性都是可以由CE通过ForCES协议进行控制的,各个LFB之间通过数据通道(Datapath)相互连接,该连接关系也是由CE经过ForCES协议定义,以形成不同的LFB拓扑结构、进而实现动态资源配置以完成各种不同的IP类型服务。典型的LFB如分类器(Classifier)、调度器(Scheduler)、IPv4 或 IPv6 转发件(Forwarder)等。1.2 要解决的问题开放编程路由器软件分成转发件和控制件两部分,分别在不同的计算机上执行。顾名思义,转发件用来转发从网络上收到的数据报,控制件用来控制转发件的功能和查询转发件的信息。本次毕业设计主要是实现开放可编程网络中控制件和转发件的通信。首先要实现主框架的开发,重点在菜单栏的设计上,然后编程实现CE和FE之间的通信过程,用Socket编程来实现,接着是即时信息框的开发,这方面内容网上有很详细的文档资料,所以只要做些细节上的编程即可,最后就是消息在即时框中的显示。1.3目的意义支持转发和控制件分离的路由器是下一代路由器发展的一个重要方向,它通过使控制件和转发件分离,实现网络功能的快速配置和重组,从而方便网络升级及服务层新业务的展开,并降低运营成本和风险。通过此次毕业设计,学习了VC+和Socket编程知识,能够熟练使用VC+ 6.0软件开发工具。1.4 论文结构本课题第二章主要介绍了这次毕业设计的关键技术:VC+,Socket 编程;第三章具体讲解程序的实现和演示;第四章总结了个人在这次毕业设计中的经验体会。第二章 关键技术本次毕业设计主要使用到VC+ 6.0实现程序的编写和调试运行,Socket编程实现开放可编程网络中控制件和转发件的通信。下面就这两方面把相关知识介绍一下。2.1 VC+ WINDOWS应用程序一定要有WinMain函数,该函数用来完成一些特殊的任务,像创建程序的主窗口,主窗口用来处理消息的代码。MFC3将WinMain隐藏在框架中,不像写SDK程序时可以很容易的找到它。 WINDOWS采用的消息处理机制也交给了程序框架,所以不必担心如何使这些消息和代码联系起来。并且WINDOWS定义好了一些消息,当窗口被创建时系统就会发送WM_CREATE消息,当点击鼠标左键时系统便会发送WM_LBUTTONDOWN消息,当用户按下键盘时系统会发送WM_CHAR消息,当用户关闭窗口时系统会发送WM_CLOSE消息,当用户进行菜单项选择或单击按钮时系统回发送WM_COMMAND消息,什么都不做系统还会发送WM_TIMER消息。先不说别的,先搞清出这几个消息再说。从MSDN中可以很方便的找到关于这几个消息的帮助文档。 WINDOWS提供通用的图形设备接口(GUI)1,通过调用(GDI)函数和硬件打交道,不必理会设备环境,WINDOWS会自动将设备环境结构映射到相应的物理设备,这就是设备无关性。 动态连接库(DLL)3应该是代码重用的典型例子(不知道可不可这样说),把一些模块、自己新编的类单独调试并编译成DLL,既增加代码的可读性也提高了程序模块的灵活性。VC+的源程序浏览器3能够使我们从类或函数的角度来了解或编辑程序,而不是直接从文件入手。在看别人的源代码时如果能熟练的使用源代码浏览器将会事倍功半。源程序浏览器主要的查看状态有以下几种:1)Definitions and References选择任何函数、变量、类型、宏定义可以看到它在项目中的定义,并且在何处和什么地方用到它。2)Call Graph/Caller Graph对于所选择的函数,给出它的调用与被调用函数的图示。3)Derived Class Graph/Base Class Graph给出类层次关系的图形表示,可以看到所选择的类的派生类和基类以及成员。4)File Outline对于所选的文件,列出文件中的类、函数和数据成员,同时还显示它们定义的位置和使用位置。下面请看运行中的Visual C+ 6.0。 2.2 Socket 编程原理2.2.1 进程通信 进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD中的管道(pipe)、命名管道(namedpipe)和软中断信号(signal)5,UNIXsystemV的消息(message)、共享存储区(sharedmemory)和信号量(semaphore)等,但都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(processID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。为了解决上述问题,TCP/IP5协议引入了下列几个概念。端口:网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。按照OSI5七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocolport,简称端口)的概念,用于标识通信的进程。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口作为类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。类似于文件描述符,每个端口都拥有一个叫端口号(portnumber)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号联系起来(绑扎)。TCP/IP端口号的分配中综合了上述两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-knownport),即使在同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP均规定,小于256的端口号才能作保留端口。地址:网络通信中通信的两个进程分别在不同的机器上。在互连网络中,两台机器可能是不同的网络,这些网络通过网络互连设备(网关,网桥,路由器等)连接。因此需要三级寻址:1)某一主机可与多个网络相连,必须指定一特定网络地址;2)网络上每一台主机应有其唯一的地址;3)每一主机上的每一进程应有在该主机上的唯一标识符。通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCP和UDP均使用16位端口号标识用户进程。网络字节顺序:不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低价先存),有的存高位字节(高价先存)。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,它们均含在协议头文件中。连接:两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。半相关:综上所述,网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。2.2.2 服务方式在网络分层结构中,各层之间是严格单向依赖的,各层次的分工和协作集中体现在各层之间的界面上。“服务”5是描述各层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务提供者,上层是请求服务的用户。服务的表现形式是原语(primitive),如系统调用或库函数。系统调用是操作系统内核向网络应用程序或高层协议提供的服务原语。网络中的n层总要向n+1层提供比n-1层更完备的服务,否则n层就没有存在的价值。在OSI的术语中,网络层及其以下各层又称为通信子网,只提供点到点通信,没有程序或进程的概念。而传输层实现的是“端到端”通信,引进网间进程通信概念,同时也要解决差错控制,流量控制,数据排序(报文排序),连接管理等问题,为此提供不同的服务方式:面向连接(虚电路)或无连接。面向连接服务是电话系统服务模式的抽象,即每一次完整的数据传输都要经过建立连接,使用连接,终止连接的过程。在数据传输过程中,各数据分组不携带目的地址,而使用连接(connectID)。本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP协议提供面向连接的虚电路。无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不能保证分组的先后顺序,不进行分组出错的恢复与重传,不保证传输的可靠性。UDP协议提供无连接的数据报服务。顺序:在网络传输中,两个连续报文在端端通信中可能经过不同路径,这样到达目的地时的顺序可能会与发送时不同。“顺序”是指接收数据顺序与发送数据顺序相同。TCP协议提供这项服务。差错控制:保证应用程序接收的数据无差错的一种机制。检查差错的方法一般是采用检验和检查(Checksum)的方法。而保证传送无差错的方法是双方采用确认应答技术。TCP协议提供这项服务。流控制:在数据传输过程中控制数据传输速率的一种机制,以保证数据不被丢失。TCP协议提供这项服务。字节流:字节流方式指的是仅把传输中的报文看作是一个字节序列,不提供数据流的任何边界。TCP协议提供字节流服务。报文:接收方要保存发送方的报文边界。UDP协议提供报文服务。全双工/半双工:端端间数据同时以两个方向/一个方向传送。缓存/带外数据:在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读或写任意数量的字节。为保证传输正确或采用有流控制的协议时,都要进行缓存。但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。在数据传送过程中,希望不通过常规传输方式传送给用户以便及时处理的某一类信息,如UNIX系统的中断键(Delete或Control-c)、终端流控制符(Control-s和Control-q),称为带外数据。逻辑上看,好象用户进程使用了一个独立的通道传输这些数据。该通道与每对连接的流相联系。由于BerkeleySoftwareDistribution中对带外数据的实现与RFC1122中规定的HostAgreement不一致,为了将互操作中的问题减到最小,应用程序编写者除非与现有服务互操作时要求带外数据外,最好不使用它。2.2.3 客户/服务器模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Servermodel),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户/服务器模式的TCP/IP。客户/服务器模式操作过程中采取的是主动请求方式。首先服务器方要先启动,并根据请求提供相应服务:1)打开一通信通道并告知本地主机,它愿意在某一公认地址上(周知口,如FTP为21)接收客户请求;2)等待客户请求到达该端口;3)接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。4)返回第二步,等待另一客户请求。5)关闭服务器客户方:1)打开一通信通道,并连接到服务器所在主机的特定端口;2)向服务器发服务请求报文,等待并接收应答;继续提出请求.3)请求结束后关闭通信通道并终止。从上面所描述过程可知:1)客户与服务器进程的作用是非对称的,因此编码不同。2)服务进程一般是先于用户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。2.2.4 套接字类型TCP/IP的socket提供下列三种类型套接字。1)流式套接字(SOCK_STREAM)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。2)数据报式套接字(SOCK_DGRAM)提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。3)原始式套接字(SOCK_RAW)该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。2.2.5 基本套接字系统调用Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话, 就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。 Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为: intsocket(intdomain,inttype,intprotocol); domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。 通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind函数原型为: intbind(intsockfd,structsockaddr*my_addr,intaddrlen); Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(structsockaddr)。 使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号: my_addr.sin_port=0;/*系统随机选择一个未被使用的端口号*/ my_addr.sin_addr.s_addr=INADDR_ANY;/*填入本机IP地址*/通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。同样,通过将my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。注意在使用bind函数是需要将sin_port和sin_addr转换成为网络字节优先顺序;而sin_addr则不需要转换。 计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。 下面是几个字节顺序转换函数: htonl():把32位值从主机字节序转换成网络字节序 htons():把16位值从主机字节序转换成网络字节序 ntohl():把32位值从网络字节序转换成主机字节序 ntohs():把16位值从网络字节序转换成主机字节序 Bind()函数在成功被调用时返回0;出现错误时返回-1并将errno置为相应的错误号。需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。 面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为: intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen); Sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地质结构的长度。Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到打断口。 Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。 Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。 intlisten(intsockfd,intbacklog); Sockfd是Socket系统调用返回的socket描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们(参考下文)。Backlog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20。如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。当出现错误时listen函数返回-1,并置相应的errno错误码。通过调用select函数可以确定一个或多个套接字的状态,判断套接字上是否有数据,或者能否向一个套接字写入数据。调用格式如下: int select( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR *exceptfds, const struct timeval FAR * timeout ); select函数各参数的作用: nfds:没有任何用处,主要用来进行系统兼容用,一般设置为0。 readfds:等待可读性检查的套接字组。 writefds;等待可写性检查的套接字组。 exceptfds:等待错误检查的套接字组。 timeout:超时时间。调用失败返回SOCKET_ERROR,超时返回0。 accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。 intaccept(intsockfd,void*addr,int*addrlen); sockfd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息(某台主机从某个端口发出该请求);addrten通常为一个指向值为sizeof(structsockaddr_in)的整型指针变量。出现错误时accept函数返回-1并置相应的errno值。 首先,当accept函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的socket上监听,同时可以在新的socket描述符上进行数据传输操作。 Send()和recv()这两个函数用于面向连接的socket上进行数据传输。Send()的调用格式如下: intsend (intsockfd,constvoid*msg,intlen,intflags); Sockfd是你想用来传输数据的socket描述符;msg是一个指向发送数据的指针;Len是以字节为单位的数据 的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。 char*msg=Hello!; intlen,bytes_sent; len=strlen(msg); bytes_sent=send(sockfd,msg,len,0); recv()函数原型为: intrecv(intsockfd,void*buf,intlen,unsignedintflags); Sockfd是接受数据的socket描述符;buf是存放接收数据的缓冲区;len是缓冲的长度。Flags也被置为0。 Recv()返回实际上接收的字节数,当出现错误时,返回-1并置相应的errno值。 第三章 程序实现和演示3.1 在VC+ 6.0 中新建工程新建工程后运行,主框架显示效果如下:而本次毕设要实现的主框架图如下所示:对于这个主框架来说,主要考虑的就是菜单栏的设计和即时信息框的实现。3.2 菜单栏的实现在设计菜单栏前,我想先介绍一下Microsoft Windows 菜单1。Microsoft Windows 菜单是由上层水平列表项以及与其相连的弹出式菜单所组成。当用户选择了上层某个列表项时,与之相连的弹出式菜单就会随即出现。多数情况下,我们可以为主窗口定义一个默认菜单资源,当窗口被创建时,该默认的菜单资源就会自动装入。当然我们也可以定义一个与主框架窗口无关的菜单资源,在这种情况下,我们在程序中就需要调用一些必要的函数,以便能够将菜单装入和激活。本程序即是上述所讲的第二种情况。菜单资源完全定义了菜单的初始形态。菜单项可以是灰色的,也可以有复选标记;菜单项的组与组之间可由分割线来分割,还可以支持多层弹出式菜单。如果第一层菜单项还有一个子弹出式菜单与之相连,那么在该菜单的右边就会有一个箭头符号,如下图本程序的主菜单展开图所示: 如果我们观察一下,就会注意到在大多数菜单项中,都有一个字符的下面带有下划线。在Developer Studio中,按下Alt-F键后再按下S键,就会击活 File Save菜单项。这种快捷方式是利用键盘来选择菜单项的标准Windows方法。如果查看一下应用程序的菜单资源文件(或者菜单编辑器的属性对话框),就会看到在应用程序的菜单项中带有下划线的字母前面都有一个字符“&”。针对本次毕业设计要创建的菜单栏包括以下几项:File,Assiociation,Inquiry ,Help。File 和Help 菜单项在刚创建应用程序框架时就已经存在,并且非常完善,基本不用做任何改动。现在我将通过打开Workspace中的ResourceView查看,找到Menu项,编辑其中的IDR_MAINFRAME主菜单来添加Assiociation,Inquiry 这两项。然后在Assiociation菜单下添加下拉菜单项:Assiociation SetUp ,接着在Assiociation SetUp下添加弹出菜单:Wait for FE to connect, stop waiting;同样的方法在Inquiry下添加Inquiry FE Name跟Inquiry FE ID。所有的菜单已经添加完毕,而对于原先已经生成的一些在此程序中不用的菜单项,比如EDIT等,要把它们删掉。到此为止,主框架的菜单栏已经设计完毕,下面就进行一些具体的编程工作。 首先在ClassWizard中找到要设计的菜单ID号,然后选中单击操作,添加函数,函数名系统会默认生成,接着双击该函数名就会进入对这个函数的具体编程过程。请阅读下面的程序段:/对Assiociation菜单下的 Wait for FE to connect弹出菜单编程void CMainFrame:OnWaitFeConnect() header = NULL;assigned_fe_id = 0x100;static char statusbuff100;/display status in status barCMainFrame *pFrame = (CMainFrame *)(AfxGetApp()-m_pMainWnd);CStatusBar *pStatus = &pFrame-m_wndStatusBar;sprintf(statusbuff, waiting for FEs connect.);m_wndEdit.InsertString(-1,waiting for FEs connect. );pStatus-SetPaneText(2,statusbuff);ThreadController = 1;HWND hWnd = GetSafeHwnd();AfxBeginThread(waitfor_fe, hWnd, THREAD_PRIORITY_NORMAL);CMenu menu;menu.LoadMenu(IDR_MAINFRAME);menu.EnableMenuItem(ID_WAIT_FE_CONNECT, MF_BYCOMMAND|MF_GRAYED);CForCESDoc *pDoc = (CForCESDoc *)pFrame-GetActiveDocument();pDoc-str.Format(Begin Waitting for FEs connection/n);/对Assiociation菜单下的stop waiting弹出菜单编程void CMainFrame:OnStopWait() / TODO: Add your command handler code hereCForCESApp *app=(CForCESApp *)AfxGetApp();static char statusbuff100;/char *str = ;CMainFrame *pFrame = (CMainFrame *)(AfxGetApp()-m_pMainWnd);CStatusBar *pStatus = &pFrame-m_wndStatusBar;sprintf(statusbuff, ); m_wndEdit. InsertString (-1,stop waitting!);pStatus-SetPaneText(2,statusbuff);ThreadController = 0;closesocket(m_socket);CMenu menu;menu.LoadMenu(IDR_MAINFRAME);menu.EnableMenuItem(ID_STOP_WAIT, MF_BYCOMMAND|MF_GRAYED); 要查询FE的属性,比如名字或者ID号,必须要在FE与CE端进行通信传输数据,主要调用send()与 recv()函数,下面是FE端的程序段:if (recv(sock, buf, sizeof(buf), 0)=0) exit(1); strcpy(msg, FEs name is FE_00000001.);if(send(sock,msg,100,0)=0)exit(1);if (recv(sock, buf, sizeof(buf), 0)=0) exit(1); msg2=FEs ID is 00000001.;len2=strlen(msg);if(send(sock,msg2,len2,0)=0)exit(1);接下来是CE端在MainFrm.cpp中针对两个查询菜单编写的程序段:/对Inquiry菜单下的Inquiry FE Name弹出菜单编程void CMainFrame:OnFeName() CMenu menu;menu.LoadMenu(IDR_MAINFRAME);menu.EnableMenuItem(ID_FE_NAME, MF_BYCOMMAND|MF_GRAYED);int len;char *msg;msg=please send FEs name.;len=strlen(msg);if(send(s_socket,msg,len,0)=0)exit(1);#define MAXDATASIZE 100 char bufMAXDATASIZE;if (recv(s_socket, buf, sizeof(buf), 0)=0) exit(1); m_wndEdit. InsertString (-1,buf);/对Inquiry菜单下的Inquiry FE ID弹出菜单编程void CMainFrame:OnFeId() CMenu menu;menu.LoadMenu(IDR_MAINFRAME);menu.EnableMenuItem(ID_FE_ID, MF_BYCOMMAND|MF_GRAYED); int len;char *msg;msg=please send FEs ID.;len=strlen(msg);if(send(s_socket,msg,len,0)=0)exit(1);#define MAXDATASIZE 100 char bufMAXDATASIZE;if (recv(s_socket, buf, sizeof(buf), 0)m_pMainWnd;if(ThreadController = 1)/SOCKET m_socket;/master socketSOCKET s_socket;/slave socketstruct sockaddr_in local_addr, remote_addr;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 影视广告方案(3篇)
- DB23-T2942-2021-良好农业(种植)管理评价规范-黑龙江省
- 农场设备维护管理制度
- 工厂后勤日常管理制度
- 地铁标识标牌管理制度
- 医院开具假条管理制度
- 军训学生教官管理制度
- 木业保险方案么(3篇)
- 商场机电设备管理制度
- 卫健系统项目管理制度
- 小区装修工程安全协议书
- 陕西省西安市碑林区铁一中学2024-2025学年下学期七年级第二次月考数学试卷
- 人教版小学数学3三年级下册(全册)教案
- ktv包房公主协议书
- 公路应急抢险协议书
- 国家中医药管理局直属事业单位招聘笔试真题2024
- 2025年计算机Photoshop功能分析试题及答案
- 国际贸易销售业务流程合规管理
- 2025年政治理论时政热点知识试题库(附含答案)
- 2025年辅导员竞聘考试题库:学生思想政治教育方法与心理健康教育相结合在实践中的应用试题
- 2025年全球经济风险试题及答案
评论
0/150
提交评论