首页 通信网络程序设计(王晓东-西电版)第2章-程序设计基础课件

通信网络程序设计(王晓东-西电版)第2章-程序设计基础课件

举报
开通vip

通信网络程序设计(王晓东-西电版)第2章-程序设计基础课件第2章程序设计基础2.1函数2.2句柄2.3事件与消息2.4进程与线程2.52.62.72.8工具方法小结  在初步建立网络以及网络程序设计的基本认识之后,读者对网络程序设计的大体轮廓也有所了解,本章将进一步介绍开展网络程序设计所要涉及的重要概念及面临的问题。具体将以容易入手的面向过程编程理念为起点,把后续学习需掌握的关键知识剥离出来并总结为八个方面分别进行介绍。  本章首先介绍作为程序设计基本工具的函数和句柄;接着讲解Windows操作系统下事件与消息的概念和区别;继而介绍程序的两种量化程序独立性的单位,即进程与...

通信网络程序设计(王晓东-西电版)第2章-程序设计基础课件
第2章程序设计基础2.1函数2.2句柄2.3事件与消息2.4进程与线程2.52.62.72.8工具方法小结  在初步建立网络以及网络程序设计的基本认识之后,读者对网络程序设计的大体轮廓也有所了解,本章将进一步介绍开展网络程序设计所要涉及的重要概念及面临的问题。具体将以容易入手的面向过程编程理念为起点,把后续学习需掌握的关键知识剥离出来并 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 为八个方面分别进行介绍。  本章首先介绍作为程序设计基本工具的函数和句柄;接着讲解Windows操作系统下事件与消息的概念和区别;继而介绍程序的两种量化程序独立性的单位,即进程与线程;然后将对网络通信的模式、服务、方式进行归纳性的介绍;最后重点说明网络程序设计需要使用的工具和方法。    函数是程序设计中除了变量、表达式和控制语句之外最重要的代码部分。变量、表达式和控制语句的通用性很强(编程语言已经决定了其使用规则),但是函数却因为开发领域或开发目的的不同有很大的区别。函数是程序功能的最小单元,是应用程序、类、组件、控件等高层功能的个体单位,网络程序设计学习的核心之一就是学会使用开发工具提供的网络接口函数(有可能是被封装的函数)。下面介绍网络程序设计中经常会用到的几种函数类型。2.1函数2.1.1基本函数  许多程序设计语言中,可以将一段逻辑独立的执行代码作为一个单独单元,这就是程序中的函数。如果函数的定义与使用没有什么特殊技术,则称之为基本函数,比如在C语言中:  intmax(intx,inty)  {   return(x>y?x:y);  }  {    //程序代码  }  上面花括号内为函数体。  如果没有返回值,类型名为void。有返回值的返回值类型由类型名称标识符决定,如:int类型返回值为int,以此类推。类型名有:void、int、long、float、int*、long*、float*……C/C++ 中的函数必须声明后才可以被调用。  调用格式为:  函数名(实参)  调用时,函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。有返回值的函数既可以进行计算,也可以作为右值进行赋值。2.1.2库函数  库函数,顾名思义就是把函数放到库里(通常是编译好的文件)。这些函数首先由一部分人(通常是软件开发商、高级程序员或程序员自己)编写完成放到一个文件里,并编译成二进制文件,供日后调用。通常库函数来自于标准库、用户或第三方提供的库。由于版权原因,库函数的源代码一般是不可见的,但在它的头文件中,可以看到库函数对外的接口。  可以以C语言为例来说明库函数的作用。C语言的基本语句十分简单,如果要使用C语言进行sin()或cos()三角函数计算,2.1.3API函数  API(ApplicationProgrammingInterface)是应用程序编程接口,程序员可以通过API对操作系统和软硬件资源进行调用,它由系统制造商提供(存在于SDK中,见2.8.2节)。为方便用户的开发,大型软件系统几乎都提供自己的API,如googleAPI、FacebookAPI等。微软为视窗操作系统开发提供的就是WindowsAPI,32位系统下的WindowsAPI称为Win32API。API不是抽象存在的,而是以一个个具体的API函数的形式存在于SDK中的,用户可以通过开发工具对其进行调用。因此,可以把API想象成一个资源库,它提供各式各样与系统服务有关的函数。事实上,在Windows下运行的视窗应用(无论是哪种语言开发)最终都是通过(直接或间接)调用WindowsAPI函数来完成其功能的,因此,可以把Win32API看成是最底层的服务。  在Windows程序设计发展初期,Windows程序员所能使用的编程工具唯有WindowsAPI函数。这些函数是Windows提供给应用程序与操作系统的接口,它们犹如“积木块”一样,程序员可以通过它们搭建出各种界面丰富、功能灵活的应用程序。但是,基于WindowsAPI的开发比较复杂,程序员必须熟记一大堆常用的API函数,而且还得对操作系统有深入的了解。  但是,如果用户要开发更灵活、更实用、更具效率及个性化的应用程序,还是需要调用API函数。虽然类库和控件使应用程序的开发简单得多,但它们只提供Windows的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是难以实现的。同时,类库和控件对API的封装隐去了很多编程细节,这对初学者非常不利,因此建议如果不是急于完成开发项目,还是从API函数的编程开始学习。  API函数的数量非常多,仅Win32API函数就数千个,程序员不必刻意地背每一个函数的用法,在需要的时候查API帮助或字典工具(参见2.8.2节)即可。2.1.4回调函数  回调函数是通过函数指针调用的函数。回调函数把自己的函数指针(地址)作为参数传递给另一个函数,供其调用。可见,回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时由实现一方的函数调用的,这样就简化了调用过程并增加了调用的灵活性。因而,回调函数常用于对事件或条件进行快速响应。  回调函数实现的机制是:  (1)定义一个回调函数;  (2)提供函数实现方在初始化时将回调函数的函数指针注册给调用者;  (3)当特定的事件或条件发生时,调用者使用函数指针调用回调函数,以对事件进行处理。  这种机制对调用者与被调用者实现了分离,调用者不关心谁是被调用者,所有它需知道的只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数指针。  回调函数的声明如下:  LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);  CALLBACK是回调函数声明的关键词。回调函数的调用者对被调用者在何处,其传递的处理程序做了什么等都不关心,而只关心返回值,因为基于返回值,它将继续执行或退出。  回调函数源自C语言,在C++ 中只用于与C代码建立接口,或用于与已有的回调接口打交道。针对上述情况,C++ 主要使用虚拟方法(参见10.1.3节)或函数符(functor),而不是回调函数。2.1.5挂钩函数  Windows操作系统是建立在事件驱动机制之上的,系统各部分之间通过传递消息互相沟通。一般情况下,进程只接受来自它内部的或其他进程发送过来的消息。因此,为了能在应用程序中监控系统的各种事件消息,拦截在进程外传递的消息,Windows提供了挂接各种回调函数的功能,这种技术就被称为挂钩或钩子(HOOK)。  挂钩技术是Windows操作系统提供的专门针对系统底层消息进行处理的一种机制,它的出现使得用户可以介入操作系统的内部,对底层进行开发。它允许应用程序轻松地截获并处理Windows消息或者特定事件,实现普通应用程序难以实现的功能。钩子实际上是一个处理消息的代码段,它通过系统调用挂入系统,从而在合适的位置插入自己的代码扩展或改变原有系统的行为。通过钩子函数,用户可以监视自己的进程或其他进程发生的事件,在捕捉到指定进程请求或返回的特定消息时,钩子函数可以在目标处理函数之前处理它,从而在系统级对所有的消息、事件进行过滤和修改。比如可以通过截获键盘输入的消息来获得键盘输入的信息等,同样还可以通过钩子函数强制结束消息的传递。  函数实现了对数据的操作,是程序的重要元件,学习网络程序设计实际上就是学习网络编程接口函数的过程。上述关于函数的介绍仅是初步的,除此之外的C++ 的成员函数、虚函数等其他内容,将结合后面的具体应用进行介绍。    在编程过程中,需要对Windows中的一些对象进行引用,一般的引用就是句柄。句柄是整个Windows编程的另一基础,一个句柄是指用于标识应用程序中的不同对象和同类对象中不同实例的唯一整数值(一个32位的无符号整数),这个实例可以是诸如窗口、按钮、图标、滚动条、输出设备、控件或者文件等对象。2.2句柄  在Windows编程中会用到大量的句柄,比如HINSTANCE(实例句柄)、HBITMAP(位图句柄)、HDC(设备描述表句柄)、HICON(图标句柄)等。最常用的就是窗口句柄HWND,窗口句柄就是CreateWindow()之类窗口创建函数的返回值hWnd(关于Windows窗口的具体创建过程参见6.6.2节)。下面函数就创建了一个窗口:  HWNDhWnd=::CreateWindowEx(0,szClassName,NULL,  WS_POPUP|WS_SYSMENU|WS_SIZEBOX|WS_VSCROLL,  100,100,300,300,0,0,hInstance,NULL);  该窗口成功创建后,后面的程序就可以通过hWnd来引用这个窗口了。进一步分析,句柄实际上是一种指向指针的指针。应用程序启动后,组成这个程序的各对象是驻留在内存中的。由于Windows是一个以虚拟内存为基础的操作系统,在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找那个对象呢?为了解决这个问题,Windows操作系统为全体应用程序腾出一些内存单元,用来专门登记各应用程序的对象在内存中的地址的变化,而前者的物理地址在系统运行期间是始终保持不变的。Windows内存管理器移动了对象在内存中的位置后,会把该对象新的地址及时地告知给对应的句柄并进行更新。因此,只要知道这个句柄,就可以间接地知道对象具体在内存中的哪个位置了,这个地址是在对象装载(Load)时由系统分配给的,当对象卸载时(Unload)又释放给系统。2.3.1事件  事件(Event)指的是由系统事先设定的、能被对象识别和响应的动作。事件是指对象对于外部动作的响应,当对象发生了某个事件,就会执行这个事件相应的代码,这段代码被称为“事件过程”。事件有系统事件和用户事件之分,系统事件由系统激发,如每隔24小时,银行储户的存款日期增加一天;用户事件由用户激发,如用户点击按钮,在文本框中显示特定的文本。  用户可以通过下面函数创建一个事件变量:  HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//安全属性  BOOLbManualReset,//复位方式  BOOLbInitialState,//初始状态  LPCTSTRlpName//对象名称  );  也可以使用OpenEvent()函数打开一个已经存在的事件句柄:  HANDLEOpenEvent(DWORDdwDesiredAccess,//请求访问权限  BOOLbInheritHandle,//句柄是否继承  LPCTSTRlpName);//事件对象名  程序员使用等待函数可以监控事件是否被置位,这样的等待函数很多,下面的等待函数可以同时等待多个事件(事件数组)是否被置位。  DWORDWaitForMultipleObjects(DWORDnCount,//内核对象的数量  CONSTHANDLE*lpHandles,//内核对象句柄的数组的指针  BOOLfWaitAll,//等待方式标识  DWORDdwMilliseconds);//等待超时时间  等待过程中,WaitForMultipleObjects()在dwMilliseconds时间段内处于阻塞态。当  WaitForMultipleObjects()因事件触发返回时,返回值是事件数组(由指针lpHandles指向)中导致该函数返回的事件在数组中的索引值。除了WaitForMultipleObjects(),可以用于等待事件置位的API函数还有WaitForMultipleObjectsEx()、WaitForSingleObject()、WaitForSingleObjectEx()等。2.3.2消息  消息是软件对象(这里指具有某种完整功能的个体)之间进行交互作用和通信的手段。通常认为,单一的一个对象是无用的,只有对象间的交互作用,程序才可以获得高阶的功能以及更为复杂的行为。举例来说,一部自行车在无人使用时,就是一堆铝合金和橡胶,没有任何作用;而只有当有其他的对象(人)来和它交互(骑)的时候,它才是有用的。软件对象与其他对象进行这样的交互与通信是利用发送给其他对象消息来实现的。  消息必须包含适量的信息。当对象A想让对象B来执行一个B中的方法(函数)时,对象A就会发消息给对象B,而B需要更多的信息才可能知道该如何正确地完成A的请求。比如,当你想改变自行车的齿轮,就必须指出哪个齿轮,改变的指标是什么。这个信息将作为消息的参数传递过来。  消息的地位非常重要,Windows就是利用消息来驱动操作系统工作的,具体介绍参见2.8.1节。2.3.3事件与消息的区别  Windows程序开发交互功能的完成主要是基于事件和消息的,二者极易被程序员混淆。消息是Windows操作系统底层支持的,在WindowsSDK的开发中,涉及消息循环的处理函数;而事件是基于消息的,是消息到达后触发的。消息发送给操作系统,让操作系统处理消息处理函数;而事件触发时程序立刻调用事件处理函数。二者的区别可以总结为以下三点:  (1)含义区别。事件用来描述程序的运行状态或环境的改变,例如鼠标移动、用户按键、窗口状态的改变、时钟计时、线程结束等。消息实际上是一种通信的机制,操作系统往往会利用消息来通知应用程序某个事件的发生,但这并不意味着消息与事件就是一一对应的或者说是相当的。例如,应用程序完全可以自己直接监视某个事件的发生并对其做出响应,而不依赖于消息;反之,应用程序也可以在没有事件发生的情况下发送消息,如:在完成通信的某个功能或者模拟一次事件时。通俗地讲,事件就是“当……的时候”,消息就是“嗨!你该干……了”。  (2)来源区别。事件只能由用户通过外设的输入产生;而产生消息的来源有三个,即由操作系统产生,由用户触发的事件转换而来,由另一个消息(属于一个应用程序)产生。  (3)激活方式区别。消息是由客户操作产生给服务者,而事件是操作系统处理消息的过程中反馈的结果。  事件和消息的区别与联系还需读者在具体的编程过程中逐步体会。  了解了句柄、消息、事件、函数,再加上掌握了编程语言提供的变量、控制语句、判断语句,读者编写具有基本功能的Windows应用程序就不存在障碍了。    进程与线程可以理解成量化程序独立性的两个单位,在后续的学习中会被反复提及,二者既有区别又有联系,在进行网络编程时要合理利用。2.4进 程 与 线 程2.4.1进程与线程的定义  进程是指一个可执行程序的实例,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。当一个应用程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。  线程是指进程的一条执行路径,是操作系统分时调度分配CPU时间的基本实体。当它被创建后,它就包含了自己独立的堆栈和CPU寄存器状态。所有的线程都是由一个叫做系统调度的程序控制的,该程序会决定执行哪个线程和在什么时候执行。  一个进程所创建的所有线程地址都采用了32位的地址空间(以32位操作系统为例),这就确保了应用程序在执行过程中能够创建足够多的线程来支持应用程序的执行。一个进程的所有线程共享它的虚拟地址空间、全局变量和操作系统资源,其所属线程可以执行进程程序的任意部分代码,即使这部分代码被另一个线程并发地执行。一个进程最少要有一条线程,这条线程称为主线程。  为了更好地阐明可执行程序、进程、线程的关系,可以做这样的比喻:可执行程序相当于曹禺先生撰写的小说《雷雨》(以静态的、纸张的形式存在),进程相当于不同话剧团(可以是山东剧团、陕西剧团、四川剧团等等)按照小说《雷雨》编排的不同版本的舞台剧(小说的动态副本),而线程就是舞台剧中一个个不同的角色(他们共用一个舞台)。可以看得出,程序在一个系统中具有唯一性,而进程和线程不具有唯一性,例如,安装在操作系统上某处的Word程序,却可以被同时打开多个副本,里面有可能有多个文档。2.4.2进程与线程的关系  一个应用程序在操作系统这个容器里可以同时存在一个或多个进程,一个进程又是由多个线程所组成的,如图2-1所示。图中管理进程和线程的分别是进程控制块(ProcessControlBlock,PCB)和线程控制块(ThreadControlBlock,TCB)。线程作为进程中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享进程所拥有的,即不同的线程可以执行同一进程内同样的函数。一个进程的众多线程中只有一个主线程。图2-1线程与进程的关系图  在网络通信程序设计中,一个进程经常会使用多个线程,其原因可以概括为两点:  (1)由于创建新进程必须加载代码,而线程要执行的代码已经被映射到进程的地址空间,所以创建、执行线程的速度比进程更快。  (2)一个进程的所有线程共享进程的地址空间和全局变量,所以简化了线程之间的通信。  还需注意,虽然在进程中使用多线程技术将大大提高进程的执行效率,但是线程本身具有可能影响进程性能的不利方面。根据操作系统的相关知识,图2-1中的TCB包含的内容有:进程标识符、处理机信息(含通用寄存器、指令计数器、PSW、用户栈指针)、进程调度信息(含进程状态、继承优先级、调度所需其他的信息)、进程控制信息(含程序的数据地址、资源清单、进程同步和通信机制)。TCB与PCB结构基本相似。当进程/线程在CPU上进行切换时,实际上就是在操作系统内核的任务管理器控制下,把CPU寄存器上的数据压栈到TCB/PCB格式的存储器里,再把即将获得CPU使用权的进程/线程的TCB/PCB入栈到寄存器的过程,这需要耗费许多宝贵的CPU时钟周期,可见进程/线程的切换是有相当代价的。综上所述,线程使用的不利因素有以下几点:  (1)线程也是程序,因而需要占用内存,线程越多,占用内存也越多;  (2)多线程需要协调和管理,所以需要CPU时间跟踪线程;  (3)线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;  (4)线程太多会导致控制太复杂,最终可能造成进程的不稳定;  (5)多线程应用中,使用的系统调用或函数必须是可重入的。  当然,我们不能因为线程所固有的缺点而撇弃线程的使用,这无异于因噎废食。实际上只要通过合理的设计和调度,就可以很好地解决上述问题。可以肯定地说,多线程技术是目前程序设计中的绝对主流。    日常生活中,人们所使用的网络通信模式主要有C/S和B/S两种,它们都是通信系统结构上的抽象。2.5.1C/S模式  在TCP/IP网络应用中,通信的两个进程间数据交互的主要模式是客户机/服务器模式(Client/ServerModel),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:2.5通信模式首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,也不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交互提供同步。  客户机/服务器模式在操作过程中采取主动请求方式:  (1)服务器方启动,并根据请求提供相应的服务:  ①打开一个通信通道并告知本地主机,它愿意在某公认地址(如)上接收客户请求。  ②等待客户请求到达该端口。  ③接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程(或线程)来处理这个客户机请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户机的通信链路,并终止。  ④返回第二步,等待另一客户请求。  ⑤关闭服务器。  (2)客户机:  ①打开一通信通道,并连接到服务器所在地主机特定端口。  ②向服务器发送服务请求报文,等待并接收应答,继续提出请求……  ③请求结束后,关闭通信通道并终止。  从上面描述的过程可知:客户机与服务器进程的作用是非对称的,因此编码不同;服务进程一般是先于客户请求而启动的,只要系统运行,该服务进程一直存在,直到正常终止或强迫终止。2.5.2B/S模式  B/S模式即浏览器和服务器模式,它是随着Internet技术的兴起,对C/S模式的一种变化或者改进。在这种结构下,用户工作界面通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓的三层(3-tier)结构。这样,就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。  B/S模式的优点如下:  (1)可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的电脑就能使用,客户端零维护。  (2)系统的扩展非常容易,只要能上网,再由系统管理员分配一个用户名和密码,就可以使用了。  (3)可以在线申请,通过公司内部的安全认证(如CA证书)后,不需要人的参与,系统可以自动给用户分配一个账号。  B/S模式也存在图形的表现能力及运行速度弱于C/S模式的缺点。2.5.3两种模式的比较  C/S、B/S模式是出于不同的思想被抽象出来的,它们各有优缺点。  C/S是建立在局域网的基础上的客户端需要,而安装专用的客户端软件,能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器,其优点是客户端响应速度快。C/S的缺点主要表现在以下几方面:  (1)扩展性欠佳。随着互联网的飞速发展,移动办公和分布式办公越来越普及,这就需要系统具有可扩展性。  (2)维护性差。客户端需要安装专用的客户端软件。首先,要涉及到安装的工作量;其次,任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护;再次,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。  (3)跨平台性差。一般对客户端的操作系统也会有限制,可能适应于Windows2000或WindowsXP,但不能用于Linux、UNIX,更不用说其他非主流的系统。  与C/S相比,B/S是建立在广域网的基础上的,其优点如下:  (1)硬件环境要求宽松。B/S的建立不必是专门的网络硬件环境,例如电话上网、租用设备、信息管理,因而比C/S适应范围更强,一般只要有操作系统和浏览器就行,甚至手持设备都可以胜任。  (2)良好的重用性。B/S由构件组成,并要求构件相对独立的功能,能够相对较好地重用,容易实现系统的无缝升级,系统维护开销较小。  (3)交互性强。B/S建立在广域网上,面向不同的用户群,分散地域,这是C/S交互性所无法做到的;同时,B/S建立在浏览器上,有更加丰富和生动的表现方式与用户交流,且开发成本大大减低,对程序员要求相对较低。  然而,C/S的显著缺点是:出于安全性考虑,B/S客户端被包裹在浏览器中,无法对本地应用进行调用,大大限制了其功能作用范围;此外,B/S对数据的处理能力也没有C/S强,不适合网络数据处理相关工作。  总体上,C/S和B/S各有优缺点,从长远看,它们通过不断改进可以实现功能互补而长期存在下去。一方面随着网页语言以及浏览器的进步,B/S在表现能力上的处理以及运行的速度上会越来越快,其缺点将会越来越少,新型的B/S描述语言在图形的渲染方面以及音频、文件的处理上也已经非常强大了;另一方面,一种改良自C/S的新通信模式P2P(参见第10章)已快速崛起,它克服了传统C/S模式的许多缺点,并提供了许多新特性,发展潜力非常巨大。    从通信的角度看,网络 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 栈中的各层所提供的服务可以分为两大类:面向连接(Connection-Oriented)服务与无连接(Connectionless)服务。2.6通信服务2.6.1面向连接服务  所谓连接,就是两个对等实体为数据通信而进行的一种结合。面向连接服务要求在数据交换之前先建立连接;当数据交换结束后终止该连接。面向连接服务是电话系统服务模式的抽象,每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程。本质上,连接是一个管道,收发数据不但顺序一致。面向连接就是1.2.2节通信网交换技术中的虚电路的实现,主要是靠收发控制数据包实现的。  一般来说,面向连接服务过程分为三个阶段:连接建立、数据传输和连接释放。在传送数据时,面向连接服务是按序传送的,这点和电路交换的许多特性很相似,因此面向连接服务又称为“虚电路服务”。面向连接服务比较适合于在一段时间间隔内向同一目的地可靠发送许多报文的情况。对于发送很短的零星报文,则因连接建立、维护和释放的开销过大,而不建议采用面向连接服务。  在TCP/IP协议栈中,TCP协议提供面向连接的服务。2.6.2无连接服务  无连接服务指两个实体之间的通信不需要先建立好一条连接,其所需的下层资源在数据传输时动态地进行分配。无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。无连接服务不保证分组的先后顺序,不进行分组出错的恢复和重传,不保证传输的可靠性。在TCP/IP协议栈中,UDP协议提供无连接的数  据报服务。对于UDP协议而言,因为UDP没有发送缓存,即使在阻塞方式下也不会发生阻塞。  无连接服务的另一个特征就是它不要求通信的两个实体同时是活跃的。只有发送端的实体正在进行发送时,它才必须是活跃的;而接收端的实体只有在进行接收操作时才必须是活跃的。无连接服务的优点是灵活方便和效率高;但它不能防止报文的丢失、重复或失序,该问题必须由应用程序根据需要自行解决。无连接服务特别适合于传送少量、零星的报文。2.6.3两种服务的比较  表2-1列出了面向连接服务与无连接服务的主要区别。这些区别为网络应用编程选择何种类型的服务提供了依据。  表2-1面向连接服务与无连接服务区别  两种服务各有优缺点,具体选择何种服务需要根据应用的特点来确定。另外,在无  连接服务的基础上增加一些差错处理、拥塞控制等措施后,也能完成面向连接的服务的功能。    网络通信过程复杂,前提条件众多,不是任何通信步骤、动作都可以一次成功的。就持续等待还是暂时放弃这个问题,形成了两种鲜明的通信(操作)方式,即通信的阻塞和非阻塞方式(有些地方也称为等待和非等待)。这两种方式的选择在网络编程时也是一件非常重要的事情,对于不同的协议,阻塞通信和非阻塞通信有不同的表现。2.7通信方式  在阻塞方式下发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待,直到协议有可用的空间;而在非阻塞模式下,调用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞,直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。通信方式对应用程序的设计方法也有直接的影响。在非阻塞方式下,应用程序必须不断地轮询是否有数据到达或有连接请求到达。这种轮询的方式耗费CPU资源较大,要尽可能避免使用,或采用多路复用来解决这一问题。在阻塞方式下则不存在这一问题,但缺点是进程或线程在执行I/O操作时将被阻塞而不能执行其他的工作,因此在单进程或单线程应用中不能使用这种模式,而在多线程应用中比较适合采用阻塞模式,一个线程被阻塞不影响其他线程的工作。  对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞方式下,如果没有连接请求到达,则等待连接调用将阻塞,直到有连接请求到达;但在非阻塞方式下,如果没有连接请求到达,等待连接调用将直接返回。在连接建立阶段,不管是阻塞方式还是非阻塞方式,发起连接请求的一方总会使调用它的进程阻塞一段时间,阻塞间隔最少等于到达服务器的一次往返时间。  另外,通信方式的选择与操作系统的类型也有关系。例如,在非抢占式操作系统中,应用程序应尽量不要使用阻塞方式。    本节将介绍网络程序开发的工具、考虑的问题及工作流程。2.8.1系统平台选择  当前,绝大多数的网络通信是建立在计算机操作系统(OperatingSystem)基础上的,操作系统为用户与硬件的交互提供了媒介,是网络编程的基础。操作系统因开发理念和应用目的的不同而具有较大的差别,进行通信程序设计之前必须对所依托的操作系统的性能特点进行很好地掌握。2.8工具方法  1.操作系统及分类  网络程序设计依托于计算机软硬件平台,用户的指令必须通过操作系统发出,硬件的信息与响应又是透过操作系统反馈给用户的。操作系统是网络编程的基本平台,网络编程的工具、语言、方法技巧又因操作系统而异。  像计算机系统根据不同应用领域分为多种类型一样,操作系统也分多种类型。但不管是哪一种操作系统,其基本目标只有一个,即要实现在不同环境下为不同应用目的提供不同形式和不同效率的资源管理,以满足不同用户的操作需要。  1)按适用面分类  计算机操作系统按适用面可分成如下几点:  (1)专用操作系统,指为特定应用目的或特定机器环境而配备的操作系统,包括一些具有操作系统特点的监控程序。例如,用于数控机床的工控机操作系统。  (2)通用操作系统,指为通用计算机配备的,能为各种计算机用户提供服务的系统。通常提到的操作系统均是指通用操作系统,如UNIX、Windows、Linux等。  (3)嵌入式操作系统,指运行在嵌入式系统环境中,对各种部件装置等资源进行统一调度、指挥和控制的操作系统。嵌入式操作系统除了具有通用操作系统的基本特性和功能外,还具有管理所嵌入设备和环境资源的功能,如WEPOS、Vxworks、嵌入式Linux等。  2)按任务处理方式分类  计算机操作系统按任务处理方式可分成以下几类:  (1)交互式操作系统,指能为用户提供交互操作支持的操作系统。操作系统都兼有交互式操作系统的功能,如UNIX、Windows、Linux等。  (2)批处理式操作系统,指以成批处理用户程序为特征的操作系统。它是相对交互式操作系统而言的。在批处理方式下,用户只能在一个批次处理完毕后,方能调试程序中可能存在的问题或获得计算的结果。批处理方式着眼于提高计算机系统效率,而交互式则着眼于方便用户使用。  3)按处理器使用特点分类  计算机操作系统按处理器使用特点可分成以下几类:  (1)分时操作系统,采用分片技术(将一个CPU的运行时间划分为多个细小的时间片、按时间片轮流方式分配给多个程序)使一个处理机为多个用户或多个程序提供服务。  (2)实时操作系统,指能够在期望的较短时间内即时响应用户要求并完成用户所需操作的操作系统。实时操作系统除具有分布式操作系统的多路性、交互性、独占性和及时性之外,还要具有可靠性要求。在实时系统中,一般都要采取多级容错技术和措施(关键部件采用冗余设计作为后备)来保证系统的安全性和可靠性。  4)按用户数量分类  计算机操作系统按用户数量可分成如下几类:  (1)单用户操作系统,只能服务于单个用户的操作系统,如MS-DOS。  (2)多用户操作系统,能同时为多个用户服务的操作系统,如Windows。  5)按硬件支撑环境和控制方式分类  计算机操作系统按硬件支撑环境和控制方式可分成如下几类:  (1)集中式操作系统,指驻留在一台计算机上或管理一台计算机的操作系统。  (2)分布式操作系统,指通过网络将大量计算机连接在一起,以获取极高的运算能力、广泛的数据共享以及实现分散资源管理等功能为目的的操作系统。  本书主要是基于Windows这种通用、交互式、实时、多用户、集中式操作系统展开网络编程设计的,因此在后续的编程过程中要特别注意这种操作系统的上述特点并展开开发。  2.Windows平台  Windows是美国微软公司推出的视窗系列操作系统,是承载本书网络应用程序的平台。目前主流的Windows产品包括:  (1) Windows95、Windows98、WindowsMe、WindowsNT、Windows2000、Windows2003;  (2) WindowsXPProfessional、WindowsXPHome;  (3) WindowsXPMediaCenterEdition;  (4) WindowsXPTabletPCEdition;  (5) WindowsCE;  (6) WindowsVista、Windows7等。  它们大都是32位的操作系统,即CPU能同时处理的数据的位数为32位,通过窗口、消息、句柄、消息驱动机制工作,但64位操作系统已经开始普及并最终会成为主流。  3.消息驱动机制  在Windows系统的运行机制中,消息是指一个 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 有关事件发生的通知。消息驱动是围绕着消息的产生与处理展开,并依靠消息循环机制来实现的。从编程角度来看,一条消息可导致某一事件的发生,如按下或移动鼠标、按键盘键等。这些事件既可以由用户引发,也可以由应用程序产生。当然,Windows系统本身也能发出消息,Windows应用程序的消息来源有四种:输入消息、控制消息、系统消息、用户消息。消息在形式上由消息名称(无符号整形变量UINT)和两个参数(WPARAM、LPARAM)构成,当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某个窗口,下面罗列了一些Windows中常见的消息及其含义。  (1) WM_LBUTTONDOWN:单击鼠标左键的消息;  (2) WM_KEYDOWN:按下一个非系统键时产生的消息;  (3) WM_CHAR:按下一个非系统键时产生的消息;  (4) WM_CREATE:由CreateWindow()函数发出的消息;  (5) WM_CLOSE:关闭窗口时产生的消息;  (6) WM_DESTROY:由DestroyWindow()函数发出的消息;  (7) WM_QUIT:由PostQuitMessage()函数发出的消息;  (8) WM_PAINT:绘制窗口消息;  (9) WM_COMMAND:菜单、控件、加速键激活消息;  (10)…:等等。  每个窗口都用句柄来标识,在一个窗口被成功申请后由系统赋予相应的一个句柄。句柄就好像是一个人的身份证,有了它,这个人就可以从事各种社会活动;否则就是一个无法享受合法公民权利的“黑户”。句柄的本质是一个系统自动维护的32位数值,在整个操作系统的任一时刻,这个数值是唯一的。但该句柄代表的窗体释放后,句柄也会被释放,这个数值又可能被其他窗体使用。也就是说,句柄的数值是动态的,它本身只是一个唯一性标识,操作系统通过句柄来识别和查找它所代表的对象。需注意的是,并非所有的句柄都是窗体的句柄,Windows系统中还有很多其他类型的句柄,如画布(hdc)句柄、画笔句柄、画刷句柄、应用程序句柄(hInstance)等,但这种句柄不能接收消息。  从运行机制观察,Windows系统是一个消息驱动的操作系统,如图2-2所示。这种操作系统会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给操作系统,这样Windows就可以同时维持多个任务。图2-2Windows系统消息处理过程  这里,不是所有的消息都要进入队列,根据这一特性可以把消息分为“队列化的”和“非队列化的”。队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序(可参考5.6.2节中Windows注册窗口程序)。也就是说,队列化消息被“发送”给消息队列,而非队列化的消息则“发送”给窗口消息处理程序。任何情况下,窗口消息处理程序都将获得窗口所有的消息,包括队列化的和非队列化的,因此窗口消息处理程序是窗口的“消息中心”。队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、输入字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)等。  在许多情况下,非队列化消息来自于对特定Windows函数的呼叫。如:当WinMain呼叫CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理程序发送一个WM_CREATE消息。当WinMain呼叫ShowWindow时,Windows将给窗口消息处理程序发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain呼叫UpdateWindow时,Windows将给窗口消息处理程序发送WM_PAINT消息。键盘或鼠标输入时发出的队列化消息信号,也能在非队列化消息中出现。例如,用键盘或鼠标选择了一个菜单项时,键盘或鼠标消息就是队列化的,而说明菜单项已选中的消息则可能就是非队列化的。2.8.2开发工具  下面对网络程序设计开发工具进行介绍。  1.编程语言  进行网络程序设计首先要选择一门编程语言,可用于网络编程的计算机语言的种类非常多。按照计算机语言来划分,可以将它们分成机器语言、汇编语言、高级语言三大类。  汇编语言的实质和机器语言是相同的,都是直接对硬件操作的,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序一般由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,因此一般比较冗长、复杂,容易出错,但其优势在于能完成一般高级语言所不能实现的硬件操作,汇编生成的可执行文件不仅较小,而且执行速度很快。  高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。高级语言主要相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的BASIC、C/C++、Java、PASCAL等,这些语言的语法、命令格式各不相同。高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,按转换方式可将它们分为两类:编译类和解释类。  1)编译类  编译类是指在应用源程序执行之前,就将程序源代码由编译器“翻译”成目标代码(机器语言),其编译过程如图2-3所示。由图2-3可见,编译过程需要使用编译器提供的分析器、代码产生器、优化器、代码生成器等软件模块。词法分析器又称扫描器,输入源程序,用于进行词法分析,输出单词符号。语法分析器简称分析器,对单词符号串进行语法分析  (根据语法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。语义分析与中间代码产生器,按照语义规则对语法分析器归约(或推导出)的语法单位进行语义分析,并把它们翻译成一定形式的中间代码。优化器对中间代码进行优化处理。目标代码生成器把中间代码翻译成目标程序。除了上述五个功能模块外,一个完整的编译程序还应包括表格管理和出错处理两部分。表格管理中的表格用于登记源程序的各类信息和编译各阶段的进展情况。出错处理程序用于当源程序有错误时,设法发现错误,把有关错误信息报告给用户。图2-3程序编译过程  编译类语言程序的目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,则必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)后才能执行,因为只有目标文件而没有源代码,所以修改起来很不方便。不同的语言使用的编译器也不同。下面介绍几种常见的网络程序设计使用的编译类语言。  (1) C语言。C语言是一种面向过程的计算机程序设计语言,是目前众多计算机语言  中举世公认的、优秀的结构程序设计语言之一,由美国贝尔研究所的D.M.Ritchie于1972年推出。  C语言具有许多优良的特性,如:把高级语言的基本结构和语句与低级语言的实用性结合起来,可以像汇编语言一样对位、字节和地址进行操作,允许直接访问物理地址,对硬件进行操作,实现许多其他高级语言无法实现的功能。C语言拥有丰富的数据类型,并引入了指针概念,可使程序效率更高。另外,C语言具有强大的图形功能,支持多种显示器和驱动器,而且计算功能与逻辑判断功能也比较强大。在适用性方面,C语言适合于多种操作系统,如Windows、DOS、UNIX等,也适用于多种机型。C语言生成目标代码质量、执行效率都很高,一般只比汇编程序生成的目标代码效率低10%~20%。  C语言的缺点主要表现在数据的封装性上,这一点使得C语言在数据的安全性、可重用性方面存在很大缺陷。因此,当C语言发展到顶峰的时刻,出现了一个叫CwithClass的版本,也就是C++最早的版本。这个版本在C语言中增加class关键字和类。后来,C语言标准委员会决定为这个版本的C语言起个新的名字,新名字以C语言中的++运算符来体现它是C语言的一种改进,故而叫C++。C++的优点是:继承了C语言的全部优点;实现了完全的可视化;具有极强的兼容性(支持OWL、VCL和MFC三大类库);编译速度非常快。  目前,支持C/C++的开发环境主要有VC++、C++Builder、GCC等。  (2) BASIC语言。BASIC语言属于高阶程式语言的一种,英文名称的全名是“Beginner'sAll-PurposeSymbolicInstructionCode”,简称“BASIC”,意为“适用于初学者的多功能符号指令码”,是一种在计算机发展史上应用最为广泛的程式语言。BASIC语言早期以直译程式的方式创始,同时也演化出许多不同名称的版本,如BASICA、GW-BASIC、MBASIC、TBASIC等。微软公司也在MS-DOS时代即推出QuickBASIC,并逐渐将之改良为兼具直译与编译的双重方式,1988年,正当Windows开始流行的时候,微软公司推出VisualBASIC(VB)forWindows,成为Windows作业环境一枝独秀的易学易用程式语言。这种语言简单易学、容易上手,它提供了强大的可视化编程能力,具有众多的控件,让编程变得像垒积木一样简单,国际化功能完善。  BASIC语言的显著缺点是:数据类型太少,不支持指针,使得它的表达能力很有限;产生的最终代码不是可执行的,是一种伪代码,需要一个动态链接库去解释执行,编译速度大大降低。  目前,支持BASIC语言的开发环境主要有VB、TurboB等。  (3) Pascal语言。Pascal是为了纪念17世纪法国著名哲学家和数学家BlaisePascal,由瑞士NiklausWirth教授于20世纪60年代末设计并创立的。Pascal语言语法结构严谨、层次分明、程序易写,具有很强的可读性,是第一个结构化的编程语言。它一出世就受到广泛欢迎,迅速地从欧洲传到美国。  Pascal语言结构严谨,可以很好地培养一个人的编程思想;它还是一个真正的面向对象的开发工具,并且是完全可视化的,且编译速度非常快,能够很好地支持数据库的开发。  Pascal语言的缺点是由于语言过于严谨,导致调试、编写都很不方便。  目前,支持Pascal语言的开发环境主要有Delphi、FreePascal、Lazarus等。  (4)  Java语言。Java语言是由SunMicrosystems公司于1995年5月推出的,起初是为TV机顶盒所设计的语言,其名字源自于因盛产咖啡而闻名的印度尼西亚爪哇岛的英文名称。  Java作为一种分布式的、面向对象的程序设计语言,以具有优良的跨平台特性而著称。它吸收了计算机科学领域的各种最新成果,使用了虚拟机,因此非常适合于互联网的开发应用。虚拟机是一个用来解释Java指令的软件包,可以让Java在任何机器上运行。同C++一样,Java是个面向对象的语言,这就意味着软件可以以部件的形式编制,为了满足某种任务,部件可以互相配合。Java同其他传统的诸如COBOL或BASIC这样的程序设计语言一样,可以创建独立运行的应用程序,不必非得在网络环境中运行Java,只不过Java对互联网上的应用开发更具优势。当前世界著名的Google、IBM、甲骨文和Sun四大公司都在力推Java语言,其应用前景也是一片光明。  Java语言的缺点是,它不提供指针功能,对硬件的操作功能有限,并且自身也非常年轻,因此仍有许多尚待改进的地方。  目前,支持Java的开发环境主要有eclipse、Jbuilder、NetBeans等。  2)解释类  解释类的执行方式类似于我们日常生活中的“同声翻译”。应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件;应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。解释类语言不需要编译器,因此它们中的绝大多数对开发环境的要求都很宽松,有的甚至使用Windows附件中的写字板就可以完成开发。当前流行的这类语言有Perl、PHP、Python、JavaScript、VBScript、CGI、ASP等。它们适合1.3.6节中所介绍的基于Web通信编程,这已超出本书范畴,因此不做过多介绍。  2.IDE开发环境  程序开发离不开集成开发环境(IntegratedDevelopmentEnvironment,IDE)。较早期程序设计的各个阶段都要用不同的软件来进行处理,如先用字处理软件编辑源程序,然后用链接程序进行函数、模块连接,再用编译程序进行编译,这样,开发者必须在几种软件间来回切换操作。现在的编程开发软件将编辑、编译、调试等功能集成在一个开发环境中,这样就大大方便了用户。IDE一般包括代码编辑器、编译器、调试器和图形用户界面工具等,就是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫做集成开发环境。常用的C语言IDE有MicrosoftVisualC++、Dev-C++、Code::Blocks、BorlandC++、WatcomC++、BorlandC++Builder、GNUDJGPPC++、Lccwin32CCompiler3.1、HighC、TurboC、C-Free、win-tc等。对于初学者,MicrosoftVisualC++6.0是一款比较好的软件,其界面友好、功能强大、调试也很方便,也非常容易过渡到微软新推出的新型IDE,如VS2005、VS2008、VS2010等。  由于本书介绍的内容是在Windows操作系统下进行的网络程序开发,因此微软IDE具有突出优势。微软IDE为程序员集成了丰富的编程接口和编程工具,如SDK、MFC、.NET等,下面将进行概要性介绍。  1) SDK  微软为Windows平台程序开发提供的编程接口称为软件开发工具箱(WindowsSoftwareDevelopmentKit,SDK)。SDK内部包含了大量的Win32API函数(详见2.1.3节),借助  SDK提供的专门用于网络编程的WinsockAPI,用户能够方便灵活地开发多种网络应用程序。基于SDK开发的程序结构清晰、执行效率高,编程更加灵活。WindowsSDK处于不断更新中,旧版本的SDK(如VC++6.0自带的1998年推出的SDK)对许多新的特性都不支持,可以从微软官方网站()上下载新的SDK(PSDK、PlatformSDK)版本,并引进安装。  2) MFC  随着面向对象编程技术的引入,微软又在其IDE中提供了一种比SDK更高级的编程工具,这就是微软基础类库(MicrosoftFoundationClasses,MFC)。MFC是一种应用框架,随微软VisualC++等开发工具发布,目前最
本文档为【通信网络程序设计(王晓东-西电版)第2章-程序设计基础课件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
自由的飞翔
竭诚提供优质的文档资源。
格式:ppt
大小:1MB
软件:PowerPoint
页数:150
分类:
上传时间:2023-02-24
浏览量:11