第10章套接字編程基础.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第10章套接字編程基础

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

文档评论(0)

df9v4fzI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档