网络编程技术(西电课件)_第2章v2.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《网络编程技术(西电课件)_第2章v2.ppt》由会员分享,可在线阅读,更多相关《网络编程技术(西电课件)_第2章v2.ppt(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、网络编程技术第二章第二章套接字网络编程接口基础套接字网络编程接口基础主要内容主要内容lUNIX套接字网络编程接口的产生与发展过程l套接字与UNIX操作系统的关系l套接字编程的基本概念l套接字的特点、应用场合、使用的数据类型l面向连接的套接字编程l套接字的工作过程、系统调用、编程实例l借助实例分析进程的阻塞问题和对策l无连接的套接字编程l无连接套接字编程的两种模式(C/S和对等)l数据报套接字的对等模式编程实例思考题西安西安北海北海北京北京西藏西藏郑州郑州已有通信基础设施,如何通信?2.1UNIX套接字网络编程接口的产生与发展套接字网络编程接口的产生与发展2.1.1问题的提出和解决问题的提出和解
2、决l应用程序与协议软件进行交互时须说明许多细节应用程序与协议软件进行交互时须说明许多细节:l是服务器还是客户机,主动还是被动通信?l发送方需说明发送的数据;l接收方需说明接收的数据如何存放。l站在应用程序实现的角度,应用程序如何方便地站在应用程序实现的角度,应用程序如何方便地使用协议栈软件进行通信呢?使用协议栈软件进行通信呢?l如果能在应用程序与协议栈软件之间提供一个软件接口,就可以方便客户与服务器软件的编程。lUNIX最早将最早将TCP/IP协议簇集成到内核中,协议簇集成到内核中,UNIX的开发者提出并实现了套接字应用编程接口。的开发者提出并实现了套接字应用编程接口。套接字简要介绍l套接字应
3、用程序编程接口:套接字应用程序编程接口:是网络应用程序通过网是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序与络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称协议栈软件之间的接口,简称套接字编程接口套接字编程接口(SocketAPI)。l定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的方式、应用程序所能实现的功能、以及开发具有这些功能的程序的难度。l套接字编程接口给出了应用程序能够调用的一组过程,以及这些过程所需的参数,每个独立的过程完成一个与协议栈软件交互的基本操作(如:建立连接、接收数据、释放链接)。套接字的起源2.1.
4、2套接字编程接口的起源与应用套接字编程接口的起源与应用l加州大学伯克利分校开发了一个包括TCP/IP协议簇的BSD UNIX,并迅速得到推广,套接字编程接口是这个操作系统的一部分。lTCP/IP标准并没有定义应用程序用来与该协议进行交互的应用程序编程接口,只规定了应该提供的一般操作,并允许各个操作系统去定义用来实现这些操作的具体API。l一个协议标准可能只是建议在应用程序发送数据时需要做某个操作,而由应用程序编程接口来定义具体的函数名和每个参数的类型。套接字就帮我们完成这些事套接字的起源l尽管协议标准允许操作系统设计者开发自己的应用程序编程接口,但由于BSD UNIX的广泛使用,后来的许多操作
5、系统及编程语言都选择了对套接字编程接口的支持。l由于这个套接字规范最早是由加州大学Berkeley分校开发的,一般将它称为Berkeley Sockets规范。lBerkeley Sockets规范规定了一系列与套接字使用有关的库函数,为在UNIX操作系统下不同计算机中的应用程序进程之间,使用TCP/IP协议簇进行网络通信提供了一套应用程序编程接口。套接字的实现2.1.3套接字编程接口的两种实现方式套接字编程接口的两种实现方式l采用两种实现套接字编程接口的方式:采用两种实现套接字编程接口的方式:l在操作系统的内核中增加相应的软件来实现;l通过开发操作系统之外的函数库来实现。l在在BSDUNIX
6、及起源于它的操作系统中,套接字函数是及起源于它的操作系统中,套接字函数是操作系统本身的功能调用,是操作系统内核的一部分。操作系统本身的功能调用,是操作系统内核的一部分。l其他操作系统供应商为了不修改基本操作系统,开发了其他操作系统供应商为了不修改基本操作系统,开发了套接字库(套接字库(SocketLibrary)来提供套接字编程接口。)来提供套接字编程接口。l套接字库中的每个过程具有与UNIX套接字函数相同的名字与参数,向没有本机套接字的操作系统上的应用程序提供套接字编程接口。两种实现的区别l套接字库与操作系统内核中实现的套接字套接字库与操作系统内核中实现的套接字在语义上是在语义上是相同的相同
7、的。l应用程序只管调用套接字编程接口。l这种方式提供了程序的可移植性:将程序从一台电脑移植到另一台电脑时,程序的源代码不需做大的改动,只需用新电脑的套接字库重新编译。l套接字库与操作系统内核直接提供的套接字编程接口套接字库与操作系统内核直接提供的套接字编程接口在实现上是不同的在实现上是不同的。l套接字库的过程需要链接到应用程序中;l并驻留于应用程序地址空间;l调用时控制从应用程序转向库程序,并进一步调用一个或多个底层操作系统的功能调用。2.1.4 套接字通信与UNIX操作系统的输入/输出l套接字编程接口采用传统的套接字编程接口采用传统的UNIXUNIX输入输入/输出模式。输出模式。lUNIX操
8、作系统对文件和所有其它操作系统对文件和所有其它的输入的输入/输出设备输出设备采用一种统一的操作模式,就是采用一种统一的操作模式,就是“打开打开-读读-写写-关闭关闭”(open-read-write-close)的的I/O模式。模式。l调用open命令获得对指定文件或设备的使用权,并返回一个用来标识该文件或设备的短整型描述符,作为用户在打开的文件或设备上进行I/O的句柄对象。l多次调用read或write命令来传输数据,期间用描述符作为命令的参数,指明要操作的对象。l传输完成后调用close命令,通知操作系统已经完成了对某对象的调用,释放所占用的资源。l当当TCP/IP协议被集成到协议被集成到
9、UNIX内核中的时候,相当内核中的时候,相当于在于在UNIX系统中引入了一种新型的系统中引入了一种新型的I/O操作。操作。l应用程序通过网络协议栈来交换数据。l操作系统和应用程序都将套接字编程接口也看作一操作系统和应用程序都将套接字编程接口也看作一种种I/O机制。机制。l操作过程类似,创建套接字-使用(读写)-关闭;l操作方法类似,申请生成一个套接字后,系统返回一个短整型描述符来标识这个套接字对象;l使用的过程名可以是相同的,如write过程可以将数据发送给另一个程序、文件或网络中的另一个进程。lUNIX系统对于各种系统对于各种I/O的集成提供了灵活性。的集成提供了灵活性。l应用程序可以编写成
10、向任何地方传输数据,取决于描述符对象代表什么(设备、文件、套接字)。l系统对套接字和其它I/O使用相同的描述符空间,使得单个应用程序既可以进行网络通信,又可以实现本地数据传输。l用户进程与网络协议的交互,实际要比用户进程与传用户进程与网络协议的交互,实际要比用户进程与传统统I/O设备的交互复杂得多。设备的交互复杂得多。l仅提供open、read、write、close四个过程远不够l使用套接字的应用程序必须说明许多细节。l应用程序使用的协议簇、远程计算机的地址、该应用程序是客户机还是服务器、希望的服务类型是面向连接的还是无连接的,等等。l为了提供这些细节,每个套接字有许多参数与选项,需要应用程
11、序提供具体值。l为避免单个套接字函数参数过多,套接字编程接口的设计者定义了多个函数。l例如,创建套接字时,先调用一个函数创建套接字,再调用其它函数说明使用套接字的细节。2.2套接字编程的基本概念套接字编程的基本概念图图2.1电插座与电话插座的作用电插座与电话插座的作用2.2.1什么是套接字(什么是套接字(SOCKET)l套接字是对网络中不同主机上应用进程之间进行双向套接字是对网络中不同主机上应用进程之间进行双向通信的端点的抽象。通信的端点的抽象。l一个套接字就是网络上进程通信的一端,提供了应用一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议栈交换数据的机制层进程利用网络协议栈交
12、换数据的机制。图图2.2应用进程、套接口、网络协议栈及操作系统的关系应用进程、套接口、网络协议栈及操作系统的关系l两个应用进程只要分别连接到自己的套接字,就可以通过网络通信,不用去管复杂的网络结构及数据传输过程。l从多个层面来理解套接字这个概念的内涵从多个层面来理解套接字这个概念的内涵l从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议栈进行通信的接口,是应用程序与网络协议栈交互的接口.l从实现的角度来讲,非常复杂。套接字是一个复杂的软件机构,包含了一定的数据结构,包含许多选项,由操作系统内核管理。l从使用的角度来讲,非常简单。对套接字的操作形成了一种网络应用程序的编
13、程接口(API),提供了一组系统调用或库函数,可以用于构造套接字、安装绑定套接字、连接套接字、通过套接字交换数据、关闭套接字,实现各种分布式应用。l l套接字编程接口套接字编程接口套接字编程接口套接字编程接口是一套操作套接字的编程接口函数,套是一套操作套接字的编程接口函数,套接字是它的操作对象。接字是它的操作对象。2.2.2 套接字的特点1 1通信域通信域l通信域:通信域:是一个计算机网络的范围,在这个范围中,所有的计算机使用同一种网络体系结构及协议栈。l套接字存在于通信域中。套接字存在于通信域中。l套接字通常只和同一域中的套接字交换数据。l如果数据交换要穿越域的边界,就一定要执行某种解释程序
14、。l这里,仅仅针对这里,仅仅针对Internet域,并且使用域,并且使用Internet协议族(即协议族(即TCP/IP协议族)来通信。协议族)来通信。2 2套接字具有三种类型套接字具有三种类型l每一个正被使用的套接字都有它确定的类型。l只有相同类型的套接字才能相互通信。(1)数据报套接字(数据报套接字(DatagramSOCKET)l数据报套接字提供无连接的、不保证可靠的、数据报套接字提供无连接的、不保证可靠的、独立的数据报传输服务。独立的数据报传输服务。l在在Internet通信域中,数据报套接字使用通信域中,数据报套接字使用UDP数数据报协议形成的进程间通路,具有据报协议形成的进程间通路
15、,具有UDP协议为协议为上层所提供的服务的所有特点。上层所提供的服务的所有特点。l一般用于轻载通信,并具有多播通信的能力。一般用于轻载通信,并具有多播通信的能力。图图2.3在在Internet通信域中,数据报套接字基于通信域中,数据报套接字基于UDP协议协议(2)流式套接字(流式套接字(StreamSOCKET)l流式套接字提供双向的、有序的、无重复的、无流式套接字提供双向的、有序的、无重复的、无记录边界的可靠的数据流传输服务。记录边界的可靠的数据流传输服务。l在在Internet通信域中,流式套接字使用通信域中,流式套接字使用TCP协议形协议形成的进程间通路,具有成的进程间通路,具有TCP协
16、议为上层所提供的协议为上层所提供的服务的所有特点。服务的所有特点。l在使用流式套接字传输数据之前,必须在数据的在使用流式套接字传输数据之前,必须在数据的发送端和接收端之间建立连接。发送端和接收端之间建立连接。l一般用于交换大批量的数据时,或者要求数据按一般用于交换大批量的数据时,或者要求数据按照发送的顺序无重复的到达目的地的时候。照发送的顺序无重复的到达目的地的时候。图图2.4在在Internet通信域中,流式套接字基于通信域中,流式套接字基于TCP协议协议(3)原始式套接字(原始式套接字(RAWSOCKET)l原始式套接字允许对较低层次的协议原始式套接字允许对较低层次的协议(如如IP、ICM
17、P)直接访问,允许用户自定义直接访问,允许用户自定义IP数据包数据包里面的很多设置,用于检验新协议的实现。里面的很多设置,用于检验新协议的实现。l原始套接字保存了数据包中的完整IP头;l前面两种套接字只能接收和发送用户数据,IP包里面的标志位不允许自己定义;l可以通过原始套接字对协议、网络、数据进行分析。3 3套接字的创建套接字的创建l套接字由应用层的通信进程创建,并为其服务。套接字由应用层的通信进程创建,并为其服务。l即,每一个套接字都有一个相关的应用进程,操作即,每一个套接字都有一个相关的应用进程,操作该套接字的代码是该进程的组成部分。该套接字的代码是该进程的组成部分。4 4使用确定的使用
18、确定的IPIP地址和传输层端口号地址和传输层端口号l在生成套接字的描述符后,要将套接字与计算机上在生成套接字的描述符后,要将套接字与计算机上的特定的的特定的IP地址和传输层端口号相关联,这个过程地址和传输层端口号相关联,这个过程称为称为绑定绑定。l一个套接口要使用一个确定的三元组网络地址信息,一个套接口要使用一个确定的三元组网络地址信息,才能使它在网络中唯一地被标识。才能使它在网络中唯一地被标识。2.2.3 套接字的应用场合l并非所有的网络应用编程都要使用套接字。并非所有的网络应用编程都要使用套接字。l套接字适合开发具有如下特点的新网络应用。套接字适合开发具有如下特点的新网络应用。l不管是采用
19、对等模式或者客户机/服务器模式,通信双方的应用程序都需要开发。l双方所交换数据的结构和交换数据的顺序有特定的要求,不符合现在成熟的应用层协议,甚至需要自己去开发应用层协议,自己设计最适合的数据结构和信息交换规程。l套接字编程层次较低,自由度较大。套接字编程层次较低,自由度较大。2.2.4 套接字使用的数据类型和相关的问题1 1三种表示套接字地址的结构三种表示套接字地址的结构l在套接字编程接口中,定义了三种结构型的数据类在套接字编程接口中,定义了三种结构型的数据类型,用来存储协议相关的网络地址,在套接字编程型,用来存储协议相关的网络地址,在套接字编程接口的函数调用中要用到它们。接口的函数调用中要
20、用到它们。(1)sockaddr结构:结构:针对各种通信域的套接字,用来表示地址的一般格式,然后要求每个协议族说明其协议地址和如何具体使用这个一般格式。structsockaddru_charsa_len;/地址总长地址总长u_charsa_family;/地址家族地址家族charsa_data14;/协议地址协议地址(2)sockaddr_in结构:结构:专门针对Internet通信域,存储套接字相关的网络地址信息,例如IP地址,传输层端口号等信息。structsockaddr_inu_charsa_len;/地址总长地址总长u_charsin_family;/地址家族地址家族,为为AF_I
21、NETu_shortsin_port;/端口号,端口号,2字节字节structin_addrsin_addr;/IP地址,地址,4字节字节charsin_zero8;/未用,全为未用,全为0,8字节字节(3)in_addr结构:结构:专门用来存储 IP地址structin_addrunsignedlongs_addrl;14字字节节可以与前一可以与前一个结构相互个结构相互强制转换强制转换(4)这些数据结构的一般用法这些数据结构的一般用法l首先,定义一个首先,定义一个sockaddr_in的结构实例,并的结构实例,并将它清零。将它清零。structsockaddr_inmyad;memset(&
22、myad,0,sizeof(structsockaddr_in);l然后,为这个结构赋值。然后,为这个结构赋值。myad.sin_family=AF_INET;myad.sin_port=htons(8080);myad.sin_addr.s_addr=htonl(INADDR-ANY);l第三步,在函数调用中使用时,将这个结构强制转第三步,在函数调用中使用时,将这个结构强制转换为换为sockaddr类型。类型。listen(listenfd,(sockaddr*)(&myad),&addrlen);思考题回到古代,怎么跟古代人通信?回到古代,怎么跟古代人通信?纸条纸条2 2本机字节顺序和网络
23、字节顺序本机字节顺序和网络字节顺序l本机字节顺序(主机字节顺序):本机字节顺序(主机字节顺序):在具体计算机中在具体计算机中的多字节数据的存储顺序。的多字节数据的存储顺序。l网络字节顺序:网络字节顺序:多字节数据在网络协议报头中的存多字节数据在网络协议报头中的存储顺序,最低位地址存储最重要的有效数据字节。储顺序,最低位地址存储最重要的有效数据字节。l网络应用程序要在不同的计算机中运行,本机字节网络应用程序要在不同的计算机中运行,本机字节顺序是不同的,但网络字节顺序是一定的。顺序是不同的,但网络字节顺序是一定的。l所以,在应用程序编程的时候,在把所以,在应用程序编程的时候,在把IP地址和端口地址
24、和端口号装入套接字时,应当把它们从本机字节顺序转换号装入套接字时,应当把它们从本机字节顺序转换为网络字节顺序;相反,在本机输出时,应将它们为网络字节顺序;相反,在本机输出时,应将它们从网络字节顺序转换为本机字节顺序。从网络字节顺序转换为本机字节顺序。l套接字编程接口为解决这个问题设置了四个函数:套接字编程接口为解决这个问题设置了四个函数:lhtons()短整数从本机顺序转换为网络顺序,用于端口号。host to network short(双字节)lhtonl()长整数从本机顺序转换为网络顺序,用于IP地址。host to network long(四字节)lntohs()短整数从网络顺序转换
25、为本机顺序,用于端口号。network to host shortlntohl()长整数从网络顺序转化为本机顺序,用于IP地址。network to host longl这四个函数将被转换的数值作为函数的参数,函数这四个函数将被转换的数值作为函数的参数,函数返回值是转换后的结果。返回值是转换后的结果。3 3点分十进制的点分十进制的IPIP地址的转换地址的转换l在因特网中,IP地址常用点分十进制的表示方法,在套接字中,IP地址是无符号的长整型数,套接字接口设置了两个函数用于两种形式IP地址的转换。(1)inet_addr函数函数unsignedlonginet_addr(constchar*cp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 技术 课件 v2
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内