《计算机网络与因特网》课件第三章 Socket 接口_第1页
《计算机网络与因特网》课件第三章 Socket 接口_第2页
《计算机网络与因特网》课件第三章 Socket 接口_第3页
《计算机网络与因特网》课件第三章 Socket 接口_第4页
《计算机网络与因特网》课件第三章 Socket 接口_第5页
已阅读5页,还剩68页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

?计算机网络与因特网?课件第三章Socket接口PARTIVNetworkApplicationsChapter3TheSocketInterface

Socket

接口3.3TheSocketAPIAlthoughprotocolstandardsallowoperatingsystemdesignerstochooseanAPI,manyhaveadoptedtheSocketAPI.TheSocketAPIisavailableformanyoperatingsystems.TheSocketAPIoriginatedaspartoftheBSDUnixoperatingsystem.TheSocketAPIisadefactostandard.3.4SocketsAndSocketLibrariesInBSDUnixandthesystemderivedfromit,socketfunctionsarepartoftheoperatingsystemitself.Inmanycases,insteadofmodifyingtheirbasicoperatingsystem,vendorscreatedasocketlibrarythatprovidestheSocketAPI.AsocketlibrarycanprovideapplicationswithasocketAPIonacomputersystemthatdoesnotprovidenativesockets.Whenanapplicationcallsoneofthesocketprocedures,controlpassestoalibraryroutinethatmakesoneormorecallstotheunderlyingoperatingsystemtoimplementthesocketfunction.3.5SocketCommunicationAndUnixI/OAnapplicationcommunicatesthroughasocketsimilartothewaytheapplicationtransfersdatatoorfromafile.Unixusesanopen-read-write-closeparadigmforallI/o补充:1.SocketAPI与UnixUnix是一个通用的交互式多用户分时操作系统。Unix由AT&T公司Bell实验室于1969年开发。Unix有两个主要的流派:SystemV和BSDSystemV由最初的AT&TUnix演化而来。BSDUnix是由加州大学伯克利(Berkeley)分校开发,其目标是提供一个具有复杂网络支持的开放系统。TCP/IP协议族也与Unix的开展有很密切关系。SocketAPI与Unix操作系统关系非常密切。

UNIX系统的I/O命令集,其模式为翻开一读/写一关闭〔open-write-read-close〕。在一个用户进程进行I/O操作时,它首先调用“翻开〞获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在翻开的文件或设备上进行I/O操作的进程。然后这个用户进程屡次调用“读/写〞以传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对象的使用。TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。首先,进行网络操作的两个进程可能在不同主机上,如何建立它们之间的联系?其次,存在多种网络协议,如何建立一种通用机制以支持多种协议?这些都是网络应用编程所要解决的问题。进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施:如UNIX

BSD中的管道〔pipe〕、命名管道〔named

pipe〕和软中断信号〔signal〕,UNIX

system

V的消息〔message〕、共享存储区〔shared

memory〕和信号量〔semaphore)等,但都仅限于用在本机进程之间通信。2

进程间通信3

网间进程通信网间进程通信要解决的是不同主机进程间的相互通信问题。可以把同机进程通信看作是其中的特例。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号〔process

ID〕唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。

3.6Sockets,Descriptors,AndnetworkI/OSocketcommunicationalsousesthedescriptorapproach.Beforeanapplicationcanuseprotocolstocommunicate,theapplicationmustrequesttheoperatingsystemtocreateasocketthatwillbeusedforcommunication.Thesystemreturnsasmallintegerdescriptorthatidentifiesthesocket.InaUniximplementation,socketsarecompletelyintegratedwithotherI/o.Asingleapplicationcanbewrittenthattransfersdatatoanarbitrarylocation.4.协议端口网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。

传输层与网络层在功能上的最大区别是传输层提供进程通信能力。因此,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口〔protocol

port,简称端口〕的概念,用于标识通信的进程。

端口是一种抽象的软件结构〔包括一些数据结构和I/O缓冲区〕。应用程序〔即进程〕通过系统调用与某端口建立连接〔binding〕后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口间的操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。

类似于文件描述符,每个端口都拥有一个叫端口号〔port

number〕的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。半相关

网络中用一个三元组可以在全局唯一标志一个进程:

〔协议,本地地址,本地端口号〕

这样一个三元组,叫做一个半相关〔half-association〕,它指定连接的每半局部。全相关一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。一个完整的网间通信需要一个五元组来标识:

〔协议,本地地址,本地端口号,远程地址,远程端口号〕

这样一个五元组,叫做一个相关〔association〕,即两个协议相同的半相关才能组合成一个适宜的相关,或完全指定组成一连接。

Socket接口应用程序的根本网络接口由操作系统提供;进程的通信端点一个socket的信息含义协议类型本地地址本地端口号远端地址远端端口号3.7ParametersAndTheSocketAPISocketprogrammingdiffersfromconventionalI/o.Becauseanapplicationmustspecifymanydetailstouseasocket.Toaccommodateallthedetails,eachsockethasmanyparametersandoptions.Toavoidhavingasinglesocketfunctionwithseparateparametersforeachoption,designersofthesocketAPIchosetodefinemanyfunction.插口结构Client-Server执行模式Client-Server端执行模式SocketbindlistenacceptSend/recv(循环)closeSocketconnectSend/recv(循环)close通信阶段连接建立阶段关闭阶段准备阶段ServerClient注意:上面这些Socket的意思与指IP地址和TCP端口号的组合的Socket不同3.8ProceduresthatImplementTheSocketAPI27.8.1TheSocketProcedure.descriptor=socket(protofamily,type,protocol)

Returnasocketdescriptorifsuccessful; -1iferror.TheSocketProcedure:Thesocketprocedurecreatesasocketandreturnsanintegerdescriptor.Itsetsvaluesforonlythefirstthreefieldsofthesocketstructure.Theotherfieldsaresetbytheotherfunctionsorbytheoperatingsystem.Argument

Protofamily:1:AF-INET4IPv4协议2:AF-INET6IPv6协议3:AF-LOCALUnix域协议4:AF-ROUTE路由插口……Argumenttypespecifiesthetypeofcommunicationthesocketwilluse.

TCP/IP的socket提供以下三种类型插口。

1.SOCK_STREAM〔字节流插口〕

提供了一个面向连接、可靠的数据传输效劳,数据无过失、无重复地发送,且按发送顺序接收。内设流量控制,防止数据流超限;数据被看作是字节流,无长度限制。文件传送协议〔FTP〕即使用流式插口。

2.SOCK_DGRAM(数据报插口〕

提供了一个无连接效劳。数据包以独立包形式被发送,不提供无错保证,

数据可能丧失或重复,并且接收顺序混乱。网络文件系统〔NFS〕使用数据报式插口。

3.SOCK_RAW(原始插口〕

该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有效劳中配置的新设备。

typeAF_INETAF_INET6SOCK_STREAMTCPTCPSOCK_DGRAMUDPUDPSOCK_RAWIPv4IPv6Family与type的组合Argumentprotocol一般情况将其设置为0,除非用在原始插口上。Protocol的常量在头文件<netinet/in.h>中定义,常量名以IPPROTO_开头。例如:IPPROTO_IGMPIPPROTO_IPIPPROTO_ICMPTheBindProcedureThebindfunctionbindsasockettoalocalsocketaddressbyaddingthelocalsocketaddresstoanalreadycreatedsocket.其调用格式如下:

bind〔socket,localaddr,addrlen〕

Returns0ifsuccessful;-1iferror.当一个socket用socket()创立后,存在一个名字空间(地址族),但它没有被命名。bind()将socket地址〔包括本地主机地址和本地端口地址〕与所创立的socket号联系起来,即将名字赋予socket,以指定本地半相关。对于效劳器而言,需要将插口绑定到一个的端口上,因为只有这样,客户端才知道该往何处发起连接。为此,需要调用bind()函数,并设置其参数。设置插口地址结构的几种常见方式IP地址端口说明通配地址0内核自动选择IP地址和端口通配地址非0内核自动选择IP地址,进程指定端口本地IP地址0进程指定IP地址,内核自动选择端口本地IP地址非0IP地址和端口均由应用进程指定“通配地址〞通常由常量INADDR_ANY指定地址在建立socket通信过程中起着重要作用,作为一个网络应用程序设计者对socket地址结构必须有明确认识。例如,UNIX

BSD有一组描述socket地址的数据结构.TCP/IP协议使用

sockaddr_in来定义地址

structsockaddr_in{u_charsin_len;/*地址总长*/u_charsin_family;/*地址族AF_INET*/u_shortsin_port;/*协议端口号*//*16位端口号,网络字节顺序*/structin_addrsin_addr;/*计算机IP地址*//*32位IP地址,网络字节顺序*/

charsin_zero[8];/*保存,未用〔置为0〕*/};其中:Structin_addr{u_longs_addr;/*将IP地址作为一个32位的二进制数来保存*/};插口地址结构网络字节顺序不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节〔小数在前〕,有的存高位字节〔大数在前〕。为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的大数在前格式,它们均含在协议头文件中。

大数在前的字节顺序〔Big-endianbyteorder〕主机中的字节顺序〔1〕小数在前的字节顺序〔Little-endianbyteorder〕主机中的字节顺序〔2〕TCP/IP协议族选择的是大数在前的字节顺序TheListenProcedureThelistenfunctioniscalledonlybytheTCPserver.Itcreatesapassivesocketfromanunconnectedsocket.Beforecallingthelistenfunction,thesocketmustalreadybecreatedandthelocalsocketaddressfieldsset.Thisfunctioninformstheoperatingsystemthattheserverisreadytoacceptconnectionthroughthissocket.监听连接──listen()

此调用用于面向连接效劳器,说明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:

listen〔socket,queuesize〕参数Socket:表示socket的描述符,标识一个本地已建立、尚未连接的插口号,效劳器愿意从它上面接收请求.Queuesize:表示该socket的请求队列的长度。用于限制排队请求的个数,目前允许的最大值为5。Returns0ifsuccessful;-1iferror.调用listen()是效劳器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流插口,且调用bind()给它赋于一个名字之后调用,而且一定要在accept()之前调用。

TheAcceptProcedureTheacceptfunctioniscalledbyaTCPservertoremovethefirstconnectionrequestfromthecorrespondingqueue.Iftherearenorequests(thequeueisempty),theacceptfunctionisputtosleep.accept调用的形式为:newsock=accept〔socket,caddress,caddresslen〕参数socket是效劳器已经创立并绑定于指定协议端口的插口描述符。参数caddress是sockaddr类型结构的地址caddresslen那么是一个指向整型的指针。accept为该连接创立一个新的插口,并将这个新的插口描述符返回给调用者。效劳器使用这个新的插口与客户进行通信,然后在结束后关闭该插口。同时,效劳器原始的插口保持不变—在效劳器结束与一个客户的通信后,它使用这个原始的插口来接收下一个客户的连接。TheConnectProcedureTheconnectfunctionisusedbyaprocess(usuallyaclient)toestablishanactiveconnectiontoaremoteprocess(normallyaserver).调用形式为:connect〔socket,saddress,saddresslen〕Returns0ifsuccessful;-1iferror参数socket是客户端计算机上用于该连接的插口的描述符。参数saddress是一个sockaddr结构,说明效劳器地址与协议端口号〔IP地址和协议端口号合在一起有时被称作端地址,即endpointaddress〕。参数saddresslen是以字节形式说明的效劳器地址的长度。四个函数调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或效劳器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:在效劳器方,无论是否面向连接,均要调用bind();在客户方,假设采用面向连接,那么可以不调用bind(),而通过connect()自动完成。假设采用无连接,客户方必须使用bind()以获得一个唯一的地址。

建立socket连接:connect()与accept()

这两个函数调用用于完成一个完整相关的建立:connect()用于由客户方发起建立连接。accept()用于使效劳器等待来自某客户进程的实际连接。

数据传输数据传输──send()与recv()

当一个连接建立以后,就可以传输数据了。常用的调用有send()和recv()。

send()调用输出数据,格式如下:

send〔socket,data,length,flag〕参数socket是使用的插口的描述符。参数data是待发送数据在内存中的地址,参数length是一个整型数,表示数据的字节数,参数flag那么包含了请求特殊选项的位〔许多项选择项是为系统调试设计的,并不能被普通的客户和效劳器程序使用〕。recv()调用用于接收输入数据,格式如下:

recv〔socket,buffer,length,flags〕参数socket是从中接收数据的插口的描述符。参数buffer表示用来存放接收到的数据的内存地址,参数length那么表示这个缓冲区的大小。参数flag允许调用者控制一些细节〔例如,允许应用在不将信息从插口中移出的情况下提取它的一个副本等〕。无连接效劳面向连接效劳Relationshipbetweentheclientandtheserver重复效劳器在一个时间只能和一个客户程序建立连接,它对多个客户程序的处理是采用循环的方式重复进行,因此叫重复效劳器。并发效劳器和重复效劳器各有利弊:并发效劳器可以改善客户程序的响应速度,但它增加了系统调度的开销;重复效劳器正好与其相反,因此用户在决定是使用并发效劳器还是重复效劳器时,要根据应用的实际情况来定。

附录1.Memset:将一个指明的字节数设置为一个值,第一个变量是指针,它指向目的地,第二个变量是它的值,第三个变量是字节数。例如:memset(&x,0,sizeof(x))字节操纵函数2.Memcpy:将一个字段的值复制到另一个字段,第一个变量是指向目的地的指针,第二个变量是指向源的指针,第三个变量是字节数。例如:memcpy(&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论