基于嵌入式平台的图像采集与传输毕业设计第二稿.doc
摘 要本课题分析了国内外嵌入式系统的发展现状,针对当前嵌入式的应用,介绍了一种基于ARM的嵌入式图像采集与传输方案。该方案借助WINCE的强大功能,具体积小,稳定性高和快速开发的优点。课题完成了基本的硬件设计和软件开发。硬件方面采用了USB摄像头与S3C2440处理器组成嵌入式图像采集装置,并通过以太网连接宿主机。软件方面分为系统软件的移植和应用软件开发方面。系统软件方面包含ARM平台的BOOTLOADER烧写和嵌入式WINCE系统定制和移植以及摄像球驱动的开发;应用软件方面包括图像采集模块的设计和TCP传输模块的设计两个部分。课题的最后对系统设计过程中遇到的问题进行了总结,并提出了改进方法。关键词:嵌入式系统;ARM;图像采集;USB摄像头;WINCE;TCP;Image Capture and Transmission based on Embedded PlatformsLU Zhi-shengAbstractBy analyzing the situations of the Embedded Systems home and abroad, in view of the current embedded applications, introduced the ARM-based embedded image capture and transmission system. By the power of WINCE, the program has specific plot of small, high stability and rapid development advantages. The design of hardware system and the development of software system are mainly discussed in this thesis.With regards to the hardware design,the embedded capture system is consist of USB camera and S3C2440 as its CPU, and as it connects to PC through Ethernet.As far as the software design, the system software and the internet application must be designed. First we must port the BootLoader and embedded WINCE kernel to target of ARM platform and drive the development of USB camera. Then, a module of picture capturing and a picture transmission based on TCP need to be designed to run on the platform of ARM.Finally, this topics summarized the problems of completed works, and the method of future improves has been given too.Key words: Embedded Systems; ARM; picture capturing; USB Camera; WINCE; TCP;目 录1. 绪论11.1嵌入式软硬件的现状与发展11.2本课题研究的内容12.开发方法综述22.1需求分析22.2.1 摄像头的选择22.2.2 嵌入式处理器的选择32.2.3 嵌入式操作系统的选择32.2 开发环境及工具42.2.1 ARM9 S3C2440A开发板42.2.2 platform builder 5.0 + visual studio 200572.3 开发流程93.嵌入式图像采集与传输程序的设计103.1 关键技术103.1.1 bootloader103.1.2 eboot103.1.3 摄像头SDK接口函数103.1.4 MFC微软基础类库133.1.5 TCP协议133.1.6 windows socket143.2 方案总体设计173.3 WINCE 驱动架构173.4图像采集模块设计193.4.1打开摄像头设备193.4.2始化摄像头设备193.4.3 初始化视频信息203.4.4 获取视频帧与JPEG图像213.4.5 关闭视频设备213.5 图像数据传输模块233.6 WINCE系统的定制254.系统的测试274.1 bootloader下载274.2 WINCE系统的烧写284.3 建立与PC操作系统与WINCE系统文件同步304.4 联机总体测试30结论与尚存在问题32参考文献35致谢36基于嵌入式平台的图像采集与传输姓名:陆志生 学号:2005394122 班级:网络工程0511. 绪论嵌入式系统把微处理器的系统电路与其专用的软件平台相结合,从而实现了系统操作的最高效率. 嵌入式系统早已融入了人们的日常生活,嵌入式系统的产品主要集中在信息家电、通信产品、工业控制器、掌上电脑领域. 家电、玩具、汽车、新一代手机、数码相机等设备也都采用了嵌入式系统的核心技术。 随着后PC 时代的到来,有理由相信嵌入式系统会呈现出蓬勃发展的趋势。日常生活中所见到的数码相机、可视电话、多媒体IP 电话和电话会议等产品,其中图像采集是最核心的技术。 图像采集的速度、质量直接影响到产品的整体效果。采用USB 接口的摄像头在一定程度上突出了采样速率高、图像质量高、通用性好的特点。1.1嵌入式软硬件的现状与发展嵌入式系统分为嵌入式软件和硬件两大类。其中嵌入式硬件一般由嵌入式处理器及其外围设备组成,而嵌入式软件一般包括嵌入式操作系统、嵌入式支撑软件和应用软件三大类。嵌入式处理器是嵌入式系统的核心,它与通用处理器最大的区别便是其大多数工作是为特定的用户群,为特定的应用而专门定制。嵌入式处理器可以分为低端的微控制器(MCU)、中高端的嵌入式微处理器(EMPU)、通信领域的DSP处理器和高度集成的片商系统(SOC)。典型的嵌入式处理器有ARM、MlpS、powerpc等等。嵌入式外围设备一般是指一个嵌入式系统中除了处理器外用于完成存储、通信、调试、显示等辅助功能的其他部件,一般可以分为存储器(FLASH应用最为广泛)、接口(并口、RS一232串口、nC总线接口等等)和人机交互(LCD、键盘和触摸屏等)三大部分。嵌入式操作系统是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域,负责嵌入系统的全部软、硬件资源的分配、调度工作,控制,协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。现在国际上有名的嵌入式操作系统有 WindowsCE、Linux、vxworks等,我国嵌入式操作系统的起步较晚,国内此类产品主要是基于自主版权的Linux操作系统,其中以中软Linux、红旗Linux、东方Linux为代表。1.2本课题研究的内容本课题主要是利用ARM9 S3C2440A开发板以及一只中星微芯片zc030x系列的USB摄像头作为硬件环境,在开发板上烧写一个WINCE5.0的操作系统,并编写一个服务端程序。而这个服务端程序运行在WINCE5.0上,主要完成的功能是调用摄像头进行图像的采集,然后将采集到的图像数据通过以太网传送到PC机上。也就实现了一个基于嵌入式平台的图像采集与传输系统的简单架构。日后可根据实际的需要,在这个架构的基础上进行改进以及增加需要的功能。因此,本课题主要针对以下内容进行分析研究:1)ARM9 S3C2440A开发板的功能结构。2)WINCE5.0操作系统的定制与烧写。3)如何识别以及调用中星微USB摄像头。4)图像采集与传输的服务端程序的设计。2.开发方法综述2.1需求分析本课题、。设计分为硬件和软件两大部分。硬件部分包括摄像头和开发平台的选择;软件部分包括系统级软件(BootLoader、操作系统和驱动程序)与用户级软件(服务端,客户端)。2.2.1 摄像头的选择摄像头是由Sensor(传感器)、DSP即 数字信号处理器、lens(镜头)、外壳模具、USB连线、电路板及阻容等周边器件构成,其最关键的是镜头,传感器和DSP。选择标准是以清晰度高,图像流畅的为好。镜头是对光线的最重要部位。一般按照材料分主要有3种,有玻璃镜片、塑胶镜片和化合物的,这里最好的要算是玻璃的,其通光系数大,一般好的镜头的通光口径也会做的较大,在光线不是很好的时候也可以得到较好的效果,但是价格要高点。塑胶的通光要差点,但是价格便宜,就这点也得到了一些中低端用户的认可。化合物的比较少。本系统中选用的摄像头镜头便是塑胶镜片的。传感器是将光信号转换成电信号的器件,目前市场见到的主要有两种:一种是CCD,一种是CMOS。而两者的主要区别在于:CCD成像像素高,清晰度高,但价格昂贵。主要应用于高端的数码相机市场。而CMOS在成像方面稍微差一些,特别光线差时,速度较慢,但是其价格低廉,适合中低端市场。综合考虑,本系统中使用的传感器是CMOS。目前用于摄像头的DSP主要有中国中星微公司的DSP芯片(ZC030X)和美国OV公司的0V511+芯片。在国内市场上的USB摄像头基本上采用的是中星微公司的DSP芯片,而 OVS11+的芯片的摄像头则比较难找到。考虑到中星微的市场普及率,本系统中采用了ZC030x的DSP芯片。2.2.2 嵌入式处理器的选择嵌入式处理器是嵌入式系统的核心,所以选择一款合适的嵌入式处理器则是非常重要的。嵌入式处理器的选择应该从应用工程背景,处理器性能,处理器功耗,开发成本,开发难易程度等方面综合考虑。目前,市面上的嵌入式处理器种类十分多,据不完全统计,全世界嵌入式处理器的品种总量己经超过一千多种,典型的嵌入式处理器有ARM、MIPS、PowerPC等等。ARM公司是全球领先的 16/32位RISC微处理器产权设计供应商,在移动通信、手持设备领域上占主导地位;MIPS技术公司是一家设计制造高性能、高档次的嵌入式32/64位处理器厂商。PowerPC以其可伸缩性好和方便灵活的特点也成为应用十分广泛的嵌入式处理器,从高端的工作站、服务器到台式计算机系统,从消费类电子产品到大型通信设备,无所不包。根据本系统的需求分析,需要对视频数据进行采集和传输,对处理器的性能有一定要求。由于ARM价格低廉,功耗低,处理能力较强,所以决定选用ARM作为本系统的核心处理器。本系统硬件平台是基于ARM9的S3C2440A开发板,这款开发板是三星公司主要为高性价比,低功耗的应用场合而设计,其资源丰富,十分适合本系统开发。2.2.3 嵌入式操作系统的选择嵌入式操作系统与嵌入式系统密不可分,是嵌入式系统的一个十分重要的组成部分,一个嵌入式系统如果没有嵌入式操作系统的支持,其实现的应用将变得十分有限,嵌入式系统的优势也将不能发挥出来。嵌入式操作系统能有效管理越来越复杂的系统资源,能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来并且能够提供库函数、驱动程序、工具集以及应用程序,大大提高了应用系统的开发效率。嵌入式操作系统的选择主要从以下几个方面考虑:(l)操作系统的硬件支持,包括操作系统是否支持目标硬件平台,基于该选择的操作系统上开发的嵌入式应用软件是否具有很好的移植性;(2)开发工具的支持程度,包括在线仿真器、编译器、汇编器、连接器、调试器等能否支持操作系统;(3)应用需求,包括操作系统的性能、兼容性、技术支持等。目前嵌入式操作系统己经从简单走向成熟,主要有vxworks、windowsCE和嵌入式Linux等。Windows CE是微软公司开发的一个32位、多任务、多线程的嵌入式操作系统。它可以用在手机、机顶盒、智能手持设备、网关、数字媒体设备、工业控制等多种场合。Windows CE支持X86、ARM、MIPS和SH四种处理器架构。并支持WiFi,USB 2.0等新型设备,并具有强大的多媒体功能。Windows CE操作系统是模块化设计的,整个系统被划分为数百个模块,嵌入式系统开发人员可以根据系统的需要,来选择自己需要的模块,从而达到减小系统体积目的。一个最小的Windows CE可运行内核只需要几百KB。而一个功能完备的Windows CE映像也不会超过64MB。与其他嵌入式操作系统相比,Windows CE的优点有如下几点:学习 / 使用简单:微软提供了方便的IDE和开发工具,对于OS的定制、裁减、交叉编译等都相对简单。此外,Windows CE的应用程序开发接口也是Win32 API,与桌面Windows的基本一致。这也方便了桌面Windows开发人员向Windows CE嵌入式开发过渡。图形界面优秀:这个理由或许是许多人员选用Windows CE的主要原因。Windows CE的图形和多媒体能力是非常优秀的,可以方便的支持多种视频音频格式。此外还支持DirectX多媒体接口,这对于开发多媒体应用(例如电子地图导航、多媒体播放器等)非常方便。应用集成度高:Windows CE自带了很多应用程序,例如Web浏览器,多媒体播放器,Office文件察看器等。这对于快速的开发一款产品相当有用。此外,互联网上有数以万计的为Windows CE开发的应用程序。VxWorks是WindRiver公司的实时操作系统,它支持各种工业标准,包括POSIX、ANSIC和TCP/IP网络协议。VxWorks运行系统的核心是一个高效率的微内核,该微内核支持各种实时功能,包括快速多任务处理、中断支持、抢占式和轮转式调度。微内核设计减轻了系统负载并可快速响应外部事件。目前在全世界装有VxWorks系统的智能设备数以百万计,其应用范围遍及互联网、电信和数据通信、数字影像、网络、医学、计算机外设、汽车、火控、导航与制导、航空、指挥、控制、通信和情报、声纳与雷达、空间与导弹系统、模拟和测试等众多领域。Linux是个与生俱来的网络操作系统,成熟而且稳定。Linux是源代码开放软件,任何人都可以修改它,或者用它开发自己的产品。Linux系统是可以定制的,系统内核目前己经可以做得很小。Linux作为一种可剪裁的软件平台系统,是发展未来嵌入设备产品的绝佳资源。但Linux内核复杂,产品开发周期相对较长。本系统对操作系统的要求是需要有强大的网络支持,最重要一点就是开发周期短,容易上手。所以综合考虑,本系统将采用嵌入式WindowsCE操作系统来进行开发。2.2 开发环境及工具2.2.1 ARM9 S3C2440A开发板(1)板子布局 图2-1 S3C2440A开发板整体布局表2-1 S3C2440A开发板开参数说明序号说明112V电源接口2电源开关3COM1,串口0(RS232)4标准JATG5GPIO引出接口6COM27SD/MMC卡8音频输入,MIC9音频输出10USB从设备11USB主设备,用来连接USB鼠标,键盘,优盘等1210M以太网口13复位键续表2-1 S3C2440A开发板开参数说明14K1-4:用户按钮15RTC电源,时钟备份电池16核心板下载接口17LCD接口18CAMERA摄像头接口 其主要的特性是: CPU处理器 -Samsung S3C2440A,主频400MHz,最高533Mhz SDRAM内存-在板64M SDRAM- 32bit 数据总线- SDRAM 时钟频率高达100MHz FLASH存储- 在板64M Nand Flash, 掉电非易失 LCD显示屏- 支持黑白、4 级灰度、16 级灰度、256 色、64K 色、真彩色TFT 液晶触目屏,尺寸为3.5 寸,屏幕分辨率为800x600 象素; 规格尺寸- 120 x 100(mm)(2)SDRAM与FALSH嵌入式系统存储器有SDRAM和FLASH,在本系统中用到两片32M的SDRAM和一片64M的NANDFLASH。SDRAM是嵌入式系统的内存,具有单位空间存储容量大和价格便宜的优点,已广泛应用在各种嵌入式系统中。当系统启动时,CPU首先从复位地址0X0000000处读取启动代码,在完成系统的初始化后,程序代码一般应调入SDRAM中运行,以提高系统的运行速度。同时,系统及用户堆栈、运行数据也都放在SDRAM中。FLASH存储器是一种可电擦写,掉电后信息不丢失的存储器,它具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,并且可由内部嵌入的算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用。作为一种非易失性存储器,FLASH在系统中通常用于存放程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。常用的FLASH为8位或16位的数据宽度,编程电压为单3.3V。主要的生产厂商为ATMEL、AMD、HYUNDAI、三星等,它们生产的同型器件一般都具有相同的电气特性和封装形式,可通用。目前使用的两种主要的FLASH为NOR型和NAND型。NAND型FLASH能够提供极高的单元密度,写入和擦除速度非常快,而且一般NAND型FLASH的存储容量很大。NOR的特点是芯片内执行,这样应用程序可以直接在FLASH内运行,不必再把代码读到系统RAM中,NOR的传输效率很高,在1一4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 由于制造商的原因,本系统使用到的S3C2440A开发板只有NAND FALSH,所以操作系统的启动代码、操作系统和应用程序只能一起烧写到NAND FLASH中。2.2.2 platform builder 5.0 + visual studio 2005(1)Platform Builder 5.0platformBuilder是为基于 MierosoftWindows CE.NET操作系统构建定制嵌入平台而提供的集成开发环境(IDE)。 PlatformBullder附带有设计、创建、构建、测试和调试一个基于 WindowsCE的平台所需的所有开发工具。本设计同样离不开这个工具,它是定制我们嵌入式平台WinCE映像唯一工具。platformBuilder中的主要特性包括:新的PlatformWizard(平台向导):可帮助您创建一个新的平台。基础配置:为各种流行的设备类别预置的定制操作系统,为自定义操作系统的创建提供了一个起点。仿真器(Emulator):通过硬件仿真加速和简化了系统的开发,使用户可以在开发工作站上对平台和应用程序进行测试。BSPWizard(BSP向导):提高了BSP(主板支持软件包)创建过程的效率。其中BSP是WinCE操作系统提供出来的一个自由度,这个是WinCE适应不同硬件的机制:适配层以WinCE的驱动接口要求,完成不同板级驱动。这样定制出来的WinCE可以在任何的硬件环境一下运转目录:一个操作系统特性的列表,您可以使用列表中的特性对平台进行定制。WilldowsCETestKit(测试工具包):提供了一个驱动程序测试工具集。内核调试器:可以对自定义的操作系统映像进行调试,并且向用户提供有关映像性能的信息。应用程序调试器:可以在自定义的操作系统映像上对应用程序进行调试。自动化的依靠性检查:可以确保支持平台配置所需的所有特性都包括在操作系统映像之中。导出向导(ExportWizard):可以向其他PlatformBuilde:用户导出自定义的目录(Catalog)特性。导出SDK向导(ExportsDKwizard):使用户可以导出一个自定义的软件开发工具包(SDK)。这个也是重要的环节,进行winCE开发的,SDK是需要PB针对每个项目导出的,每个项目是不同,当然肯定一种冗余的解决方案。但是对于每个项目而言,它们是专用且方便的。远程工具:可以执行同基于WindowsCE的目标设备有关的各种调试任务和信息收集任务。其界面下图:图2-3 Platform Builder 5.0界面(2)Visual Studio 2005Visual Studio 是一套完整的开发工具集,用于生成 ASP.NET Web 应用程序、XML Web Services、桌面应用程序和移动应用程序。Visual Basic、Visual C+、Visual C# 和 Visual J# 全都使用相同的集成开发环境 (IDE),利用此 IDE 可以共享工具且有助于创建混合语言解决方案。另外,这些语言利用了 .NET Framework 的功能,通过此框架可使用简化 ASP Web 应用程序和 XML Web Services 开发的关键技术。本系统利用它来开发主要是因为其集成了智能设备程序的开发工具以及仿真程序,开发人员调试程序只需在指定的仿真程序里面运行调试,而不用每次都将程序下载到板子上。其界面如下:图2-4 Visual Studio 2005界面2.3 开发流程嵌入式系统是一个复杂而专用的系统,在进行系统开发之前,必须对系统的功能需求进行分析并明确定义系统的外部功能和内部软硬件结构,然后对系统进行总体结构设计和系统的各个模块分割,分别实现硬件的规划与设计,应用软件的规划与设计以及操作系统的剪裁。在完成操作系统的剪裁和应用软件的开发后,通常还需要将它们移植到同系统结构的硬件平台上进行系统调试、功能模拟,明确系统调试无误后,才将操作系统及相关软件移植到自己的专用硬件平台上,再进行系统整体功能测试,其流程如图2-5所示。图2-5 整体开发流程图3.嵌入式图像采集与传输程序的设计3.1 关键技术3.1.1 bootloaderBootLoade是系统加电后运行的第一段代码。一般只是在启动时运行很短时间,然而对一个嵌入式系统来说,这一部分却是整个系统的一个无比重要的组成部分,不可缺少。在一般嵌入式系统中,系统复位或者加电后通常从地址Ox0000000O处开始执行,而这个地址一般正是存放的BootLoader启动代码。通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终加载操作系统内核准备好正确的环境。3.1.2 ebootEboot是通过以太网下载WinCE映像时的起作用的代码。它通过USB下载工具被下载到SDRAM和 PlatformBuilder配合完成对 NANDFlash的WinCE映像的烧写工作。它是由MS提供好的代码,不需要进行任何修改。3.1.3 摄像头SDK接口函数本系统所用摄像头的驱动程序已由开发商编写好的了,并将其封装成动态链接库形式,即ZC030X.DLL文件。我们只需调用其提供的接口函数就可以实现其相应的功能。ZC030X SDK接口函数说明如下表:表3-1 ZC030X SDK接口函数说明函数名称函数说明形式参数参数说明返回值capInitCamera初始化并返回当前活动的摄象头数目void无当前活动的摄象头数目,最多可支持8个摄象头capGetCurrentVersion获得当前驱动程序版本信息int index摄象头索引当前驱动程序版本信息字符串长度unsigned char *pBufOut用来接收版本信息的字符缓冲区int lenOut字符缓冲区长度capGetVideoFormat获取当前视频格式和尺寸模式int index摄象头索引0表示调用成功,其他值表示调用失败int *pFormat用来接收视频格式的缓冲区int *pSizeMode用来接收尺寸模式的缓冲区capSetVideoFormat设置当前视频格式和尺寸模式int index摄象头索引0表示调用成功,其他值表示调用失败int format要设置的视频格式(VIDEO_PALETTE_RGB565 - VIDEO_PALETTE _JPEG)int sizeMode要设置的尺寸模式(VIDEO_SIZE_VGA, VIDEO_SIZE_SIF)capGetPicture同时获取一帧视频图象和JPEG图片int index摄象头索引0表示调用成功,其他值表示调用失败unsigned char *pFrameBuf用来接收一帧视频图象的缓冲区Unsigned int bufferLenpFrameBuf缓冲区长度Unsigned char *pJpgBuf用来接收一帧JPEG图片的缓冲区Unsigned int jpgLenpJpgBuf缓冲区长度PDWORD pdwActualOut用来接收返回长度的整型数组地址capGrabFrame获取一帧视频图象int index摄象头索引一帧视频图象的实际长度(字节数)unsigned char *pFrameBuf用来接收一帧视频图象的缓冲区unsigned int bufferLen缓冲区长度capGetLastJpeg获取一帧JPEG静态图片int index摄象头索引一帧JPEG静态图片的实际长度(字节数)unsigned char *pFrameBuf用来接收一帧JPEG静态图片的缓冲区unsigned int bufferLen缓冲区长度capStartCamera启动摄象头开始捕获视频int index摄象头索引0表示调用成功,其他值表示调用失败capStopCamera停止摄象头捕获视频int index摄象头索引0表示调用成功,其他值表示调用失败capCloseCamera关闭所有活动的摄象头void无无3.1.4 MFC微软基础类库 它是本文应用程序的框架基础,很多软件形式都是基于MFC的,当然它也带来很多WINDOWS编程的便利。什么是MFC?MFC是Application Framework类库,更确切的定义是:微软公司将数以千计的 WindowsAPI,利用面向对象的原理和C+语言,有逻辑的组织起来。这种有逻辑的组织使得MFC是一组凝聚性强、组织性强的类库。如果要利用MFC开发你的应用程序,必须同时引进数个必要的类,互相搭配支持。而这些类所实例后的对象关系在MFC设计时,便己经存在,信息的流动机制也都已经设定。Application Framework对软件设计带来的革命性的好处是:程序的模型已经存在,而且是标准、简洁、高效的。程序员只要依照各自的需求,在 Application Framework的派生类中改写虚函数,或者添加新的成员函数,以满足各自的应用需要。这将大大缩短程序设计的时间,使得程序员可以将更多的精力花在程序特定的功能实现上,而不是关注繁琐的、重复的windows程序框架的搭建而且使得程序设计的方法标准化,程序的可读性大大增强。MFC将具有相当固定程度的WinMain内部操作包含在CWinAPP中,将有着相当固定行为的WndProc内部操作包装在CFrameWind或CDialog中。换句话说:CWinAPP代表程序的主体。CFrameWnd或CDialog代表程序的主窗口。虽然,WinMain内部操作和WndProc内部操作有着相当程度的固定行为,但是它们毕竟需要针对不同的应用程序而有某种变化。所以,你必须以这两个类为基础,派生出自己的类CMyWinAPP和CMyFrameWnd,并改写其中部分成员函数(虚函数)或添加成员函数。MFC的程序员需要做的只是根据自己的应用需要,在MFC合适的类下派生出子类,修改虚函数、添加新成员函数和添加消息响应函数。3.1.5 TCP协议TCP位于OSI七层模型中的第四层传输层,是一种面向连接的、可靠的、基于字节流的通信协议。一个TCP连接有发送方的IP地址与TCP端口号和接收方的IP地址与TCP端口号标识。建立一个TCP连接的作用就是让发送方和接收方都做好准备,准备好之后就开始数据传输。总的来说,TCP具有以下特点:表3-2 TCP特点主要特性含义(1)面向流的投递服务应用程序之间传输的数据可视为无结构的字节流,流投递服务保证收发的字节顺序完全一致。(2)面向连接的投递服务数据传输之前,TCP模块之间需建立连接,其后的TCP报文在此连接基础上传输。(3)可靠传输服务接收方根据收到的报文中的校验和,判断传输的正确性:如果正确,进行应答,否则丢弃报文。发送方如果在规定的时间内未能获得应答报文,自动进行重传。(4)缓冲传输TCP模块提供强制性传输(立即传输)和缓冲传输两种手段。缓冲传输允许将应用程序的数据流积累到一定的体积,形成报文,再进行传输。(5)全双工传输TCP模块之间可以同时收发数据流。(6)流量控制TCP模块提供滑动窗口机制,支持收发TCP模块之间的端到端流量控制。由于UDP协议是无连接的,不可靠的传输,但也正是因为其是无连接的,而且不提供像TCP那样的可靠机制,流控制以及错误恢复功能,所以比TCP负载消耗少,传输速度快,但也考虑到本系统的数据传输必需做到准确无误,所以本系统决定使用TCP协议。3.1.6 windows socketWinSock并不是一种网络协议,它只是一个网络编程接口,也就是说,它不是协议,但是它可以访问很多种网络协议,你可以把他当作一些协议的封装。现在的WinSock已经基本上实现了与协议无关。你可以使用WinSock来调用多种协议的功能。那么,WinSock和TCP/IP协议到底是什么关系呢?实际上,WinSock就是TCP/IP协议的一种封装,你可以通过调用WinSock的接口函数来调用TCP/IP的各种功能.例如我想用TCP/IP协议发送数据,我就可以使用WinSock的接口函数Send()来调用TCP/IP的发送数据功能,至于具体怎么发送数据,WinSock已经帮你封装好了这种功能。Internet套接字有两种类型:一种是“Stream Sockets”(流格式),另外一种是“datagram Sockets”(数据报格式)。数据报套接字有时也叫“无连接套接字”。流式套接字是可靠的双向通讯的数据流,自身提供一种错误控制机制。本系统正是采用流式套接字进行设计,图3-1为面向TCP的网络通信流程。图3-1 面向TCP的网络通信流程进行socket编程时,首先要调用socket函数来进行初始化并创建一个套接字,函数原型为 int socket(int domain, int type, int protocol):其中domain应该设置成“AF_INET”,参数type是选择用哪一种套接字,是SOCK_STREAM类型还是SOCK_DGRAM类型,本系统中使用的是流式套接字,所以选择SOCK_STREAM。最后,把protocol设置为 “0”。socket()调用成功将返回一个在后面的系统调用中用到的socket描述符,失败返回-1。当套接字成功创建之后,要将套接字和机器上的一定的端口关联起来。函数原型为 int bind(int sockfd, struct sockaddr*my_addr, int addrlen);其中第一个参数为前面调用socket函数所返回的套接字描述符,第二个参数为sockaddr类型的指针保存了地址和端口的信息,第三个参数一般为 sizeof(struct sockaddr)。调用成功后将可以在该端口监听服务请求。sockaddr_in结构如下:struct sockaddr_inshort sin_family ;u_short sin_prot ;struct in_addr sin_addr ;char sin_sero8 ;其中,sin_family 一般为AF_INET,代表Internet(TCP/IP)地址族;sin_port代表连接的端口号,sin_addr代表IP地址。在调用bind()的时候不可以使用小于 1024的端口号,因为所有小于 1024的端口号都被系统保留,可以选择从1024到65535中没有被其它应用程序占用的端口号即可。要使socket处于被动的监听模式,可以使用listen函数,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到用户应用程序处理它们。函数调用的原型为:int listen(int sockfd, int backlog);backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们。backlog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20,在本系统中设置为8。如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。当出现错误时listen函数返回-1。服务器接收客户的连接请求使用accept()函数。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。函数原型为:int accept(int sockfd,void *addr,int *addrlen);addr通常是一个指向 sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息,整型指针变量addrten一般为sizeof(struct sockaddr_in)的,出现错误时accept函数返回-l。当accept函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的socket上监听,同时可以在新的socket描述符上进行数据传输操作。函数 send()和recv()用于流式套接字或者数据报套接字的通讯。函数send()的原型为 int send(int sockfd, const void *msg, int len,int flags s)。sockfd是准备发送数据的套接字描述符。msg是指发送的数据的指针。len是数据的长度。把flags设置为0就可以了