预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共92页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第2章UNIX中的套接字网络编程接口2.1UNIX套接字网络编程接口的产生与发展套接字应用程序编程接口:是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称套接字编程接口(SocketAPI)。 定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的方式、应用程序所能实现的功能、以及开发具有这些功能的程序的难度。 套接字编程接口给出了应用程序能够调用的一组过程,以及这些过程所需的参数,每个独立的过程完成一个与协议栈软件交互的基本操作(如:建立连接、接收数据、释放链接)。2.1.2套接字编程接口的起源与应用 加州大学伯克利分校开发了一个包括TCP/IP协议簇的BSDUNIX,并迅速得到推广,套接字编程接口是这个操作系统的一部分。 TCP/IP标准并没有定义应用程序用来与该协议进行交互的应用程序编程接口,只规定了应该提供的一般操作,并允许各个操作系统去定义用来实现这些操作的具体API。 一个协议标准可能只是建议某个操作在应用程序发送数据时是需要的,而由应用程序编程接口来定义具体的函数名和每个参数的类型。尽管协议标准允许操作系统设计者开发自己的应用程序编程接口,但由于BSDUNIX的广泛使用,后来的许多操作系统及编程语言都选择了对套接字编程接口的支持。 由于这个套接字规范最早是由Berkeley大学开发的,一般将它称为BerkeleySockets规范。 BerkeleySockets规范规定了一系列与套接字使用有关的库函数,为在UNIX操作系统下不同计算机中的应用程序进程之间,使用TCP/IP协议簇进行网络通信提供了一套应用程序编程接口。2.1.3套接字编程接口的两种实现方式 采用两种实现套接字编程接口的方式: 在操作系统的内核中增加相应的软件来实现; 通过开发操作系统之外的函数库来实现。 在BSDUNIX及起源于它的操作系统中,套接字函数是操作系统本身的功能调用,是操作系统内核的一部分。 其他操作系统供应商为了不修改基本操作系统,开发了套接字库(SocketLibrary)来提供套接字编程接口。 套接字库中的每个过程具有与UNIX套接字函数相同的名字与参数,向没有本机套接字的操作系统上的应用程序提供套接字编程接口。套接字库与操作系统内核中实现的套接字在语义上是相同的。 应用程序调用套接字过程不必管它是由操作系统内核过程提供的,还是由库过程提供的。 这种方式提供了程序的可移植性:将程序从一台计算机移植到另一台计算机时,程序的源代码不需改动,只要用新计算机上的套接字库重新编译即可。 套接字库与操作系统直接提供的本机套接字编程接口在实现上是不同的。 套接字库的过程需要链接到应用程序中; 并驻留于应用程序地址空间; 调用时控制从应用程序转向库程序,并进一步调用一个或多个底层操作系统的功能调用。2.1.4套接字通信与UNIX操作系统的输入/输出 套接字编程接口采用传统的UNIX输入/输出模式。 UNIX操作系统对文件和所有其它的输入/输出设备采用一种统一的操作模式,就是“打开-读-写-关闭”(open-read-write-close)的I/O模式。 调用open命令获得对指定文件或设备的使用权,并返回一个用来标识该文件或设备的短整型描述符,作为用户在打开的文件或设备上进行I/O的句柄。 多次调用read或write命令来传输数据,期间用描述符作为命令的参数,指明要操作的对象。 传输完成后调用close命令,通知操作系统已经完成了对某对象的调用,释放所占用的资源。当TCP/IP协议被集成到UNIX内核中的时候,相当于在UNIX系统中引入了一种新型的I/O操作。 应用程序通过网络协议栈来交换数据。 操作系统和应用程序都将套接字编程接口也看作一种输入/输出机制。 操作过程类似,创建套接字-使用-删除; 操作方法类似,申请生成一个套接字后,系统返回一个短整型描述符来标识这个套接字对象; 使用的过程名可以是相同的,如write过程可以将数据发送给另一个程序、文件或网络中的另一个进程。UNIX系统对于各种I/O的集成提供了灵活性。 应用程序可以编写成向任何地方传输数据,取决于描述符对象代表什么(设备、文件、套接字)。 系统对套接字和其它I/O使用相同的描述符空间,使得单个应用程序既可以进行网络通信,又可以实现本地数据传输。用户进程与网络协议的交互,实际要比用户进程与传统I/O设备的交互复杂得多。 仅提供open、read、write、close四个过程远不够. 使用套接字的应用程序必须说明许多细节。 应用程序使用的协议簇、远程计算机的地址、该应用程序是客户机还是服务器、希望的服务类型是面向连接的还是无连接的,等等。 为了提供这些细节,每个套接字有许多参数与选项,需要应用程序提供具体值