网络编程书籍讲义第七讲.ppt
《网络编程书籍讲义第七讲.ppt》由会员分享,可在线阅读,更多相关《网络编程书籍讲义第七讲.ppt(54页珍藏版)》请在三一办公上搜索。
1、第1页,人民邮电出版社,第7章 网络程序设计入门,第2页,7.1有关网络程序设计的一些概念,7.1.1什么是网络应用软件?人们常将应用软件分为单机版的和网络版,单机版应用软件就是一般程序设计语言教科书重点讲述的,在单机环境下使用的软件,这种软件的特点是结构简单,易于学习与设计。另一种应用软件是需要安装在网络环境中使用的,网络中不同主机上安装的软件需要进行相互通信才能完成其功能,这就是网络应用软件,这种软件的特点是结构较为复杂,软件设计者不但要掌握程序设计的一般知识,还要掌握网络系统的有关知识与理解网络通信协议。由于计算机网络的广泛应用,目前软件开发的主流是设计这类网络环境下的应用软件。,第3页
2、,7.1有关网络程序设计的一些概念,7.1.2网络中两个通信程序如何相互识别对方在操作系统中我们知道,同一个系统中不同的两个进程间进行通信时,通过系统分配的进程号(process ID)就可以惟一标识一个进程,也就是说两个相互通信的进程,只要知道知识对方的进程号就可以进行通信。而网络情况下进程间的通信问题,就要复杂得多,不能只简单的用进程号来标识不同的进程。首先要解决如何识别网络中不同的主机问题,其次因为各个主机系统中都独立地进行进程号分配,并且不同系统中进程号的产生与分配策略也不同,所以在网络环境中不能再通过进程号来简单的识别两个相互通信的进程了。那么,在网络环境中,两个相互通信的进程,如何
3、识别对方呢?,第4页,7.1有关网络程序设计的一些概念,7.1.2网络中两个通信程序如何相互识别对方在网络中为了标识通信的进程,首先要标识网络中进程所在的主机,其次要标识主机上不同的进程。关于网络环境下不同主机的识别问题,在讲传输层协议时,我们知道为了完成端到端进程之间的通信,在互联网中使用IP地址来标识不同的主机。关于主机上不同的进程问题,在前面讲端口号时已经说明过,在网络协议中使用端口号来标识主机上的不同进程。还有一个问题,就是前面我们讨论的都是在TCP/IP协议下,端到端进程的标识问题,其实网络应用程序由于不同的主机可能使用不同的网络协议,其工作方式不同,地址的表示格式也不同,因此,网络
4、中进程的通信还要解决多种协议的识别问题。这样为了惟一的标识网络中通信的一个进程(即通信的某一方)就要使用一个如下的三元组:(本地协议,本地IP地址,本地端口号),第5页,7.1有关网络程序设计的一些概念,7.1.2网络中两个通信程序如何相互识别对方这样一个三元组由于它只指定了通信时一条连接的半个部分,即通信的一方,所以叫一个半相关(half-association)。如果要完整的表示网络中进行通信的两个进程,那么就要使用一个如下结构的六元组:(本地协议,本地地址,本地端口号,远地协议,远地地址,远地端口号),第6页,7.1有关网络程序设计的一些概念,7.1.2网络中两个通信程序如何相互识别对方
5、下面我们仔细分析一下这样一个六元组,在互联网中通信的两台主机在网络层都只能使用IP协议,但在网络层之上可以选择使用TCP协议或UDP协议。这样就可能得到以下四种类型的相关六元组:(本地TCP协议,本地IP地址,本地端口号,远程TCP协议,远程IP地址,远程端口号)(本地UDP协议,本地IP地址,本地端口号,远程UDP协议,远程IP地址,远程端口号)(本地TCP协议,本地IP地址,本地端口号,远程UDP协议,远程IP地址,远程端口号)(本地UDP协议,本地IP地址,本地端口号,远程TCP协议,远程IP地址,远程端口号),第7页,7.1有关网络程序设计的一些概念,7.1.2网络中两个通信程序如何相
6、互识别对方如果通信的两端使用不同的协议,即上面第3和第4种情况,根据前面我们所学的知识,由于TCP协议和UDP协议使用的协议格式大不相同,因此通信时双方在传输层不能相互识别对方送来的数据,也就不可能进行正常的通信,因此上面说的后两种情况是不存在的。换句话说,通信的两个进程在端到端的传输层只能使用相同的协议,因此一个完整的主机间的通信,可以简单的用一个五元组来标识通信的两个进程:(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)综上所述,这样一个五元组可以惟一标识网络中两个通信的进程或一条连接,因此叫做一个相关(association)。为了在进程间进行正确的通信,只有两个协议相同的半
7、相关才能组合成一个可用的相关。,第8页,7.1有关网络程序设计的一些概念,7.1.3Windows Sockets介绍1.Windows Sockets的概念Windows Sockets顾名思义,它就是在Windows环境下使用的一套网络编程机制(或规范),常常简称为Winsock。该规范是在上个世纪90年代初制定的。这套规范是在Windows操作系统下得到广泛应用的、开放的、支持多种协议的网络编程接口。该规范从1991年的1.0版到1997年的2.2.1版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的大力支持下,现在已经成为Wind
8、ows环境下网络编程事实上的标准。,第9页,7.1有关网络程序设计的一些概念,7.1.3Windows Sockets介绍2.Windows Sockets的来源Sockets本来是UNIX操作系统下流行的一种网络编程接口(API),它是1983年在Berkeley(加州大学伯克利分校)4.2 BSD操作系统中被首先引入的,因此被称为“Berkeley Socket API”。在刚开始时它只支持TCP/IP协议,后来在4.3 BSD操作系统中增加了对国际标准化组织ISO制定的开放系统互联参考模型OSI网络协议的支持。由于BSD操作系统做为一种主流的UNIX操作系统被广泛使用,因此“Berkel
9、ey Socket API”这个模型就成了TCP/IP网络的编程接口标准。从4.2 BSD开始,Berkeley套接口API在不断地完善和发展,一直到1995年的4.4 BSD-Lite2为止。Windows网络应用程序编程接口Windows Sockets API就是在1991年根据4.3 BSD操作系统的“Berkeley Socket API”制定的。,第10页,7.1有关网络程序设计的一些概念,7.1.3Windows Sockets介绍3.Windows Sockets的版本目前常用的Winsock有两个版本:一个是16位的Winsock 1.1,由动态链接库WINSOCK.DLL提
10、供支持;另一个是32位的Winsock 2.2,由动态链接库WSOCK32.DLL提供支持。前者主要用在Windows早期的版本中,如Windows 95等版本中,后者主要用在Windows2000和Windows XP等版本中。另外说明一下,本书所讲的Windows下TCP/IP编程接口为Winsock 2.2,与低版本的Winsock 1.1相比它主要是扩充了对其它协议(如IPX、NETBIOS等)的支持。由于Winsock 2.2与Winsock 1.1规格中所有的函数调用完全兼容,所以低版本的Winsock应用程序在Winsock 2库加载的情况下也能够正常运行。,第11页,7.1有关
11、网络程序设计的一些概念,7.1.3Windows Sockets介绍4.Winsock API函数的分类在Winsock规范中把Winsock API函数集分为与BSD Socket(用在UNIX中)相兼容的基本函数、网络数据信息检索函数和Windows专用扩展函数三类。由此可以看出,Winsock来源于BSD Socket API,但它又根据Windows操作系统的特点进行了扩充。因此,Winsock规范的核心内容是符合Berkeley Socket风格的库函数,但为了使程序员能充分地利用Windows消息驱动机制进行编程,也定义开发了一组针对Windows的扩展库函数。这份规范定义了应用程
12、序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。,第12页,7.1有关网络程序设计的一些概念,7.1.3Windows Sockets介绍5.Windows Sockets对多线程的支持Windows Sockets支持多线程的Windows进程。一个进程可以包含一个(在Windows 3.1非多线程版本中,一个任务对应了一个仅具有单个线程的进程)或多个同时执行的线程。,第13页,7.1有关网络程序设计的一些概念,7.1.4套接口的概念Windows Sockets API依靠套接口(Socket)进行通讯,那么什么是套接口(Socket)呢?对于初学网络程序设计的人们
13、来说,套接口是一个既抽象且又很重要的概念。因此要注意对于套接口这个概念的理解与体会。套接口可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点,这个端点是一个逻辑上的概念。通信时其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(Network Interface Cards,NIC)相连的传输介质将这段信息发送到另外一台主机的Socket中,使这段信息能传送到其他程序中,如图7-1所示。,第14页,7.1有关网络程序设计的一些概念,第15页,7.1有关网络程序设计的一些概念,为了满足不同的通信程序对通信质量和性能的要求,一般的网络
14、系统提供了三种不同类型的套接口,以供用户在设计网络应用程序时根据不同的要求来选择。这三种套接口分别是:流式套接口(SOCK_STREAM):它提供了一种可靠的、面向连接的双向数据传输服务。实现了数据的无差错、无重复地发送。内设流量控制,被传输的数据看作是无记录边界的字节流。在TCP/IP协议族中,使用TCP协议来实现字节流的传输,当用户想要发送大批量的数据,或者对数据的传输有较高的要求时使用流式套接口。,第16页,7.1有关网络程序设计的一些概念,数据报套接口(SOCK_DGRAM):它提供了一种无连接、不可靠的双向数据传输服务。数据包以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证
15、。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。在TCP/IP协议族,使用UDP协议(Winsock 2也支持其它的协议)来实现数据报套接口。在同一台计算机上或负载较轻的LAN上,因为出现差错的可能性较小,可以使用数据报套接口进行数据传输,这样通信的质量可以得到保证,并且通信的效率较高。另外,在前面的章节中我们已经说过,UDP还可以实现广播通信。原始套接口(SOCK_RAW):该套接口允许对较低层协议(如IP或ICMP)进行直接访问。常用于检验新的网络协议实现,也可用于测试新配置或安装的网络设备。要说明的是Windows Sockets规范并没有规定Windows
16、Sockets DLL必须支持原始套接口。套接口在编程时对于用户来说是可见的,应用程序一般仅在同一类型的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯(一般很少这样做)。,第17页,7.1有关网络程序设计的一些概念,7.1.5套接口编程原理为了便于读者理解套接口的工作机制,我们举一个日常生活中的例子。电话服务系统与面向连接的套接口机制非常相似。电信局提供的普通电话服务(比如114提供查号服务功能)类似于服务器(Server),普通电话用户类似于客户(Client)。比如有客户要查某单位的电话号码,于是就开始了一次查号的通信过程,该过程可以分为以下几个阶段(对于下面提
17、到的函数,只要知道其大概的含义就可以了,在后面将要专门介绍这些函数的用法):首先电信局必须要有一个电话总机,相当于套接口通信机制中提供服务的服务器,在Socket中通过调用socket()函数来开启一个服务,也就是说要创建一个提供服务的套接口。,第18页,7.1有关网络程序设计的一些概念,7.1.5套接口编程原理电信局必须给电话总机分配一个号码(如114,意思是查号服务的号码是114),以便用户通过拨该号码得到电话服务,同时接入该电信局的用户必须知道该总机的号码。同样,在服务器端也要为启动的服务指定一端口号,并且要连接到该服务器的客户必须要知道该端口号(如客户要查询电话号码时,必须要知道查号台
18、是114)。这在Socket中通过调用bind()函数把一个端口与一个特写服务联系起来(叫绑定)。电信局的114查号台下会开设一些自动服务的分机,但是它们的数量是有限的。总机开通后就一直在监听(listen)用户的拨号,用户拨打114时,可能拨通,得到服务;也可能拨不通,就会听到忙音。同样地,我们在建立一个socket服务时,也会调用listen()函数来监听客户的请求。,第19页,7.1有关网络程序设计的一些概念,7.1.5套接口编程原理对于用户来说,如果知道电信局的查号号码,在想得到查号服务时就可以拨打114,请求得到电信局的服务,这相当于在客户端要进行的操作。同样在Socket通信中,在
19、客户端也要先用socket()函数建立一个请求服务的套接口,然后调connect()函数进行连接与服务器进行连接。当然和电话一样,用户可能连通得到服务,也可连不通,请求的服务失败。电信局的总机接受了某用户拨打的电话后,负责把用户与一个分机连通,而总机本身则又回到等待的状态,以等待其它客户的请求。在Socket通信中这个相当于服务器调用accept()函数进入监听处理过程。服务器端建立一个新的套接口来对此连接提供服务,而原先的套接口则又回到监听状态,等待新客户的请求。服务器与客户之间通信时,使用recv()函数接收套接口数据,使用send()函数向套接口发送数据。,第20页,7.1有关网络程序设
20、计的一些概念,7.1.5套接口编程原理服务完成后,挂上电话,线路断开,一次服务过程结束,不然的话则该线路一直被占用,浪费了通信资源。在服务器和客户之间,最后也要使用closesocket()函数关闭套接口,释放该套接口上的有关资源,这可以由通信的任何一方或双方同时提出。上面提到的Winsock API函数是使用套接口编程时所使用的最基本的一些函数,几乎每一个使用套接口编程的网络应用程序都要使用这些函数,后面我们将详细介绍这些函数的功能和用法。用户编写网络应用程序时,错误的出现是不能可避免的,因此对错误的检查和控制是至关重要的,一个好的或者说成功的Winsock应用程序应该尽可能地检测和处理各种
21、错误。由于下面我们接触到的所有函数都有调用成功与不成功两种情况,因此,我们打算先为大家介绍Winsock中错误检查和控制的方法。,第21页,7.1有关网络程序设计的一些概念,7.1.5套接口编程原理对Winsock函数来说,返回错误是非常常见的。与大多数系统调用类似,Winsock函数发生的错误也有两种。多数情况下发生的错误都是无关紧要的,通信仍可在套接口上进行,但有些错误是致命性的,使应用程序无法继续执行。不成功的Winsock函数调用返回的最常见的值是宏定义SOCKET_ERROR,在Winsock的头文件中(如Winsock 2.h),它的数值是-1。实际上,如果调用一个Winsock函
22、数时,发生了错误,我们应该进一步使用WSAGetLastError()函数,以获得对这一错误详细的说明,该函数的使用非常简单,它的格式如下:int WSAGetLastError(void);,第22页,7.1有关网络程序设计的一些概念,7.1.6网络字节顺序不同的主机对字节值的存储顺序不同。在存储由多个字节组成的一个字时,有的计算机在起始地址处存放低整数的低序号字节,这种存储格式叫“小序在前”(little-endian)。而有的计算机在起始地址处存放整数的高序号字节,这种存储格式叫“大序在前”(big-endian)。每种计算机究竟采用那种字节存储顺序由各自的设计决定,如Windows系列
23、的操作系统使用的是小序在前的存储方式,而Sun OS和Solaris等采用的大序在前的存储方式。在计算机中,TCP/IP协议使用的16位整数(如端口号)和32位整数(如IP地址)是按计算机各自的“主机字节”(host-byte)来表示的。在网络中,为了保证数据的正确性,在网络通信协议中必须指定网络字节顺序。如果在网络中使用IP地址和端口号,按“互联网联网标准”的要求,指定的多字节值必须用“大序在前”的形式来表示,一般称之为“网络字节”(network-byte)顺序。,第23页,7.1有关网络程序设计的一些概念,7.1.6网络字节顺序在Winsock中有一系列的函数可用于多字节数的转换,把它们
24、从主机字节顺序转换成网络字节顺序,反之亦然。下面四个API函数便将一个数从主机字节顺序转换成网络字节顺序:htonl():参数是主机字节顺序的一个4字节数,函数返回网络字节顺序的数。WSAHtonl)():参数是主机字节顺序的一个4字节数,函数返回网络字节顺序的数。htons():参数是主机字节顺序的一个2字节数,函数返回网络字节顺序的数。WSAHtons():参数是主机字节顺序的一个2字节数,函数返回网络字节顺序的数。,第24页,7.2网络程序工作模型,7.2.1网络程序要考虑的几个问题网络程序与单机环境下运行的程序有较大的区别,程序员在设计网络程序时应该了解与注意这些问题,才能设计出高质量
25、的网络应用程序。1.并发环境下的网络编程我们常用的操作系统Windows和Linux等都支持多进程(或线程)的并发执行,多进程应用程序,由于涉及到资源共享、进程之间的同步等问题,其编程要比单进程环境复杂得多。,第25页,7.2网络程序工作模型,7.2.1网络程序要考虑的几个问题在多进程编程环境中,使用的系统调用或函数必须是可重入的。哪些系统调用或系统函数是可重入的,这在不同的系统中是不同的。一般的系统都会对其进行详细说明。在多线程应用中,对系统调用或函数的使用有很多限制,因此在编程时应该注意的是对于那些不可重入的调用或函数,系统如果不提供多线程安全的版本,则应用编程人员需要避免使用或自己编写相
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 书籍 讲义 第七

链接地址:https://www.31ppt.com/p-5450682.html