欢迎来到天天文库
浏览记录
ID:41032843
大小:1.23 MB
页数:27页
时间:2019-08-14
《第10 章 套接字编程基础》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第10章套接字编程基础网络编程有两种主要的编程接口,一种是BerkeleyUNIX(用于BSDUNIX)的套接字编程接口,另一种是AT&T的TLI接口(用于UNIXSystemV)。本章主要介绍Berkeley套接字编程接口的基本结构、常用的调用和程序以及使用方法。10.1套接字概述20世纪80年代早期,美国国防部高级研究计划署给加利福尼亚大学伯克利分校提供了资金,在UNIX系统上首次实现了TCP/IP。Socket编程界面是由4BSDUNIX首先提出,目的是解决互联网的进程通信问题。由于越来越多的计算机厂商采用了BerkeleyUNIX,套接字接口被广泛认可并广泛采用,成为事实上的工业
2、标准。目前的SYSV,BSD,OSF都将套接字接口作为系统的一部分。在当时设计如何支持TCP/IP协议时,有两种加入函数的方法,一种是直接加入支持TCP/IP协议的调用,另一种是加入支持一般网络协议的函数,而用参数来指定支持TCP/IP协议。Berkeley采用了后者,这样可以支持多协议族。10.1.1套接字描述符套接字使用UNIX文件描述符(filedescriptor)作为与其他程序通信的方式。UNIX程序在执行任何形式的I/O的时候,程序是在读写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。这个文件可能是一个网络连接、队列、管道、终端、磁盘上的文件或者其他的设备。
3、每个进程都有一个文件描述符表,该表中存放打开的文件描述符。用户使用open()等函数得到的文件描述符其实是文件描述符在该表中的索引号,该表项的内容是一个指向文件表的指针。应用程序只要使用该描述符就可以对指定文件进行操作。同样,套接字接口增加了网络通信操作的抽象定义,与文件操作一样,每个打开的套接字都对应一个整数,称它为套接字描述符,该整数也是套接字描述符在文件描述符表中的索引值。但套接字描述符在描述符表中的表项并不指向文件表,而是指向一个与该套接字有关的数据结构。BSDUNIX中新增加了一个socket()函数,应用程序可以调用它来新建一个套接字描述符,完成建立通信的初步工作,一旦建立了
4、一个套接字,应用程序可以使用其他特定的调用来为它添加其他详细信息,以完成建立通信的过程。socket实质上提供了进程通信的端点,进程通信之前双方必须各自创建一个端点。在互联网内部每一个socket用一个半相关描述:{协议,本地地址,本地端口}一个完整的socket连接则用一个相关描述:{协议,本地地址,本地端口,远地地址,远地端口}每一个socket有一个本地唯一的socket号,由操作系统分配。·297·Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket调用,客户随机申请一个socket,系统为之分配一个socket号,服务器拥有全局公认的socke
5、t,客户可以向它发出连接请求和信息请求。10.1.2客户―服务器模式网络编程中最常见的是客户-服务器模式。以该模式编程时,服务器端有一个进程(或多个进程)首先启动,在指定的端口上监听,等待客户端的程序发来请求,客户端在需要时向服务器端发出的连接请求。一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。在使用TCP协议时,一般服务器端进程先使用socket()函数调用得到一个描述符,然后使用bind()函数将一个名字与套接字描述符连接起来,对于Internet域就是将Internet地址绑定到套接字。之后,服务器端使用listen()函数指出等待服务请求队列的长度。然后就可以使用
6、accept()函数等待客户端发起连接(一般以阻塞方式等待连接,也有使用非阻塞的方式),一旦有客户端发出请求,accept()函数返回客户端的地址信息,并返回一个新的套接字描述符,该描述符与原先的套接字有相同的特性,这时服务器端就可以使用这个新的套接字进行读写操作。一般服务端可能在accept()函数返回后创建一个新的进程与客户进行通信,父进程则再到accept()函数处等待另一个连接。客户端进程一般先使用socket()函数得到一个套接字描述符,然后使用connect()函数向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过套接字描述符
7、进行读写操作了。图10.1是在客户端和服务器端使用TCP时,客户进程和服务器进程套接字建立连接的过程。图10.1 面向连接的客户─服务器模型时序图·297·使用无连接的UDP协议时,服务器端进程先创建一个套接字,之后调用recvfrom()函数接收客户端的数据报,然后调用sendto()函数将要返回客户端的消息发送给客户进程。客户端也要先创建一个套接字,再使用sendto()函数向服务器端进程发出请求,使用recvfrom()函数得
此文档下载收益归作者所有