




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,数据通信与计算机网络(第二版)电子教案,笫二十二讲Socket编程,2,本讲内容,第八章运输层8.4Socket编程8.4.1Socket接口概念8.4.2Socket编程模型8.4.3UnixSocket编程8.4.4WinSock编程,3,8.4.1Socket接口概念,Socket接口是TCP/IP网络通信的API。它规定了许多函数和例程,程序员可以用它们来开发TCP/IP网络上的应用程序。网间进程通信不同主机进程间的相互通信。端口网络中可以被命名和寻址的通信端点,是操作系统可分配的一种资源,用于标识通信的进程(如TCP或UDP端口)。端口类似于文件描述符,端口操作类似于一般的I/O操作。进程在使用端口前需要将自己与该端口号联系起来(绑定)。,4,8.4.1Socket接口概念,端口号有两种基本分配方式全局分配由一个公认的中央机构统一管理和分配,并将结果公布于众(著名端口)。TCP和UDP规定,小于1024的端口号作为全局分配的保留端口。如21、80、110等。本地分配(动态连接)进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号。TCP和UDP规定,大于1024的端口号用于本地分配的自由端口。TCP/IP端口号的分配综合了上述两种方式。,5,8.4.1Socket接口概念,地址网络通信中通信的两个进程分别在不同的机器上。主机上的进程通过三级寻址:网络地址;网络上的主机地址;主机上的进程标识。TCP/IP主机地址由网络ID和主机ID组成(32位IP地址);进程标识使用端口号(16位)。网络字节顺序为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP使用16比特整数和32比特整数的高价先存格式。,6,8.4.1Socket接口概念,连接两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。半相关网络中在全局唯一标识一个进程的三元组:(协议,本地地址,本地端口号)。它指定连接的每半部分。全相关标识一个完整的网间通信的五元组:(协议,本地地址,本地端口号,远地地址,远地端口号)。即两个协议相同的半相关组合成一个合适的相关,即完全组成一连接。,7,8.4.1Socket接口概念,服务方式“服务”是描述相邻层之间关系的抽象概念,即网络中各层向紧邻上层提供的一组操作。下层是服务提供者,上层是请求服务的用户。服务的表现形式是原语(primitive),如系统调用或库函数。TCP/IP传输层以不同的服务方式提供“端到端”通信。面向连接和无连接服务TCP提供面向连接的字节流服务。UDP提供无连接的数据报服务。顺序指接收数据顺序与发送数据顺序相同。TCP提供顺序服务。,8,8.4.1Socket接口概念,差错控制保证应用程序接收的数据无差错的一种机制。如校验和、确认等。TCP提供差错控制服务。流控制在数据传输过程中控制数据传输速率的一种机制,以保证数据不被丢失。TCP提供流控制服务。字节流仅把传输中的数据段看作是一个字节序列,不提供数据流的任何边界。TCP提供字节流服务。,9,8.4.1Socket接口概念,数据报接收方要保存发送方的数据报边界。UDP提供数据报服务。全双工/半双工端-端间数据同时以两个方向/一个方向传送。TCP/IP的端到端通信是全双工的。缓存TCP/IP运输实体具备缓存能力。紧急数据TCP支持紧急数据功能。,10,8.4.1Socket接口概念,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server,C/S)模式客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。C/S模式的建立基于以下两点:建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享。网间进程通信完全是异步的。,11,8.4.1Socket接口概念,C/S模式在操作过程中采取的是主动请求方式服务器方(进程)先启动,并根据请求提供相应服务a)打开一通信通道并告知本地主机,它愿意在某一端口上(如HTTP使用80)接收客户请求;b)等待客户请求到达该端口;c)接收到重复服务请求,处理该请求并发送应答信号;接收到并发服务请求,激活一新进程来处理这个客户请求。服务完成后,关闭此新进程与客户的通信链路,并终止。d)返回第二步,等待另一客户请求。e)关闭服务器。,12,8.4.1Socket接口概念,客户方(进程)a)打开一通信通道,并连接到服务器所在主机的特定端口;b)向服务器发服务请求报文,等待并接收应答;继续提出请求.c)请求结束后关闭通信通道并终止。从上面所描述过程可知:客户与服务器进程的作用是非对称的,因此编码不同。服务进程一般是先于客户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。,13,8.4.1Socket接口概念,TCP/IPsocket提供三种类型套接字流式(stream)套接字提供面向连接、可靠的数据流传输服务,数据无差错、无重复地发送,且按发送顺序接收。数据报式(datagram)套接字提供无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。原始式(raw)套接字允许对较低层协议,如IP、ICMP直接访问。,14,8.4.2Socket编程模型,Socket网络通信模型网络通信最终是由两台主机上的两个进程完成,通过网络传递它们之间的数据,它实现的是网络间进程通信。网络通信对话的每一端称为一个端点,当使用Socket接口对网络通信编程时,Socket是网络通信过程中端点的抽象表示。实践中,Socket由主机地址和TCP/UDP端口号等组成。为了通过Socket接口进行网络通信,程序在网络对话的每端都需要一个Socket。两个Socket之间的通信可以是面向连接的(点对点连接,实现TCP通信)也可以是无连接的(实现UDP通信)。,15,8.4.2Socket编程模型,从网络的角度看,Socket是通信连结的端点;从程序设计者的角度看,Socket是编写网络通信程序的API。Socket接口使用Unix系统传统的I/O命令集处理模式,即“打开-读-写-关闭(open-read-write-close)”这样的处理过程。,16,8.4.3UnixSocket编程,Unix下许多网络调用都需要一个变元,该变元是指向Socket地址结构的指针。在中定义:structsockaddr在中定义:structin_addrstructsockaddr_in,17,8.4.3UnixSocket编程,1、建立一个Socket为了进行网络I/O,第一件事就是建立Socket。它调用Socket函数,指定所要求的协议的类型(TCP/UDP/IP等),返回一个类似文件描述符的句柄:Socket_handler=socket(intfamily,inttype,intprotocol)调用Socket函数时,Socket执行体将建立一个Socket,并返回一个指向描述符表入口的Socket句柄(或描述符)。Socket执行体为用户管理描述符表。访问描述符表的唯一途径是通过Socket描述符。在通信完成之后,用户应该通过调用close函数来关闭Socket,释放所分配的资源:Result=close(intsock_handle),18,8.4.3UnixSocket编程,2、配置Socket面向连接的客户程序使用connect函数来配置Socket。connect函数要求用户指定一个Socket句柄、一个包含远地主机信息的地址结构和此地址结构的长度:Result=connect(intsocket_handle,structsockaddr*servaddr,intaddrlen)由于无连接客户程序没有和远地主机建立直接连接,所以它必须对协议端口进行侦听,以便接收对它的服务请求所产生的数据报应答。同样,为了接收客户的请求,服务器程序必须对一个特定的协议端口进行侦听。SocketAPI中的bind函数让程序将一个本地地址(包括主机地址和协议端口)和一个Socket联系起来:Result=bind(intsocket_handle,structsockaddr*myaddr,intaddrlen),19,8.4.3UnixSocket编程,3、通过Socket传输数据通过一个连接的Socket发送数据使用面向连接数据的SocketAPI函数不需要目的地址而使用Socket句柄作为其参数:Result=write(intsocket_handle,chat*message_buffer,intbuffer_length);Result=writev(intsocket_handle,structiovecio_vector,intiovcount);Result=send(intsocket_handle,char*buffer,intbufflen,intspecial_flags)这三个函数都返回一个整数值:如果正确执行,函数将返回传送的字节数;如果发生错误,函数返回-1。,20,8.4.3UnixSocket编程,通过一个无连接的Socket发送数据为了通过一个无连接的Socket发送数据,可以使用sendto和sendmsg这两个SocketAPI函数。Result=sendto(intsocket_handle,char*buffer,intbuflen,intflags,structsockaddr*to,intaddrlen);Result=sendmsg(intsocket_handle,structmsghdr*msg,intspecial_flags)sendmsg函数传输数据时,让用户使用一个报文结构而不是一个简单的数据缓冲区。,21,8.4.3UnixSocket编程,通过Socket接收数据Socket接口包括五个与传送数据函数相对应的接收函数(read,readv,recv,recvfrom,recvmsg)。对应的传送接收函数使用同样的参数。Result=read(intsock_handle,chat*buffer,intlength);Result=readv(intsock_handle,structioveciov,intiovcount);Result=recv(intsock_handle,char*buf,intlen,intflags);Result=recvfrom(intsock_handle,char*buf,intlen,structsockaddr*fromaddr,intfromlen);Result=recvmsg(intsock_handle,structmsghdr*msg,intflags),22,8.4.3UnixSocket编程,4、服务器的Socket使用面向连接的服务器需要调用listen和accept函数。listen函数先将服务器置于被动的侦听模式,accept函数接着建立一个Socket连接。listen函数将所有到达的服务请求在一个请求队列上排队,也就是说,listen函数让Socket执行体建立一个输入数据队列,将到达的服务请求保存在此队列上,直到程序处理它们为止。Result=listen(intsocket_handle,intquery_length)accept函数让服务器接收客户的连接请求。在建立好输入队列以后,服务器就调用accept函数,然后睡眠,并等待客户的连接请求。Result=accept(intsocket_handle,structsockaddr*addr,intlength),23,8.4.3UnixSocket编程,5、Socket编程大致流程面向连接通信,24,8.4.3UnixSocket编程,无连接通信,25,8.4.3UnixSocket编程,6、I/O多路复用Unix系统中提供select系统调用来实现。用户进程使用这种系统调用等待几种事件发生,一旦这几种事件中任何一种发生,内核将用户进程唤醒。intselect(intmaxfd,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout),26,8.4.3UnixSocket编程,7、一些有用的库函数字节顺序转换u_longhtonl(u_longhostlong);u_shorthtons(u_shorthostshort);u_longntohl(u_longhostlong);u_shortntohs(u_longhostshort)地址转换unsignedlonginet_addr(char*ptr);char*inet_ntoa(structin_addrinaddr)地址-地址转换structhostent*gethostbyname(char*hostname);structhostent*gethostbyaddr(char*addr,intlen,inttype);structservent*getservbyname(charservname,char*protname),27,8.4.3UnixSocket编程,一个例子客户方给服务方发送数据,服务方把接收到的数据显示出来。,28,8.4.4WinSock编程,WindowsSockets(Winsock)是一个基于Socket模型的API。WindowsAPI只在MicrosoftWindows操作系统类(包括MicrosoftWindows95/NT/2000/XP等)中使用。Winsock是以动态链接库(DLL)来实现Socket接口的。Winsock规范将API库分为三类:WinsockAPI包含的BerkeleySocket函数检索有关域名、通信服务和协议等Internet信息的数据库函数BerkeleySocket例程的Windows专用的扩展函数,29,1、包含一个新的头文件在Windows环境下,编写网络程序时,需要头文件Winsock.h。但不需要再包含Windows.h头文件。,8.4.4WinSock编程,30,8.4.4WinSock编程,2、Winsock的初始化和清除WindowsSocket要求Winsock程序都使用两个与Windows有关的函数,WSAStartup和WSACleanup。在调用任何其它Winsock函数以前,必须先调用WSAStartup函数。当用户程序调用WSAStartrup时,用户程序就和Winsock.dll开始了一个协调工作。Result=WSAStartup(WINSOCK_VERSION,Result=bind(socket_handle,local_socket_address,address_length);Result=listen(socket_handle,query_length);Result=accept(socket_handle,socket_address,address_length);,34,6、使用SocketWinsock数据传输函数:send和sendto函数用于数据传送,recv和recvfrom函数用于数据接收。如果函数执行成功,将返回实际传输的字节数。send和recv函数只用于连接的Socket,而其它函数不受限制。使用一个连接的SocketResult=send(socket_handle,message_buffer,buffer_length,special_flags);Result=recv(socket_handle,message_buffer,buffer_length,special_flags),8.4.4WinSock编程,35,使用一个无连接Socket无连接Socket使用sendto和recvfrom函数进行数据传输:Result=sendto(socket_handle,message_buffer,buffer_length,special_flags,socket_address_structure,address_structure_length);Result=recvfrom(socket_handle,message_buffer,buffer_length,special_flags,socket_address_structure,address_structure_length),8.4.4WinSock编程,36,7、阻塞函数、非阻塞函数和异步函数Winsock将函数分为阻塞函数和非阻塞函数。阻塞函数在完成其网络操作之前禁止用户程序调用其它Winsock函数。非阻塞函数要么立即完成其操作要么返回一个错误信息,它不等待其工作完成。Winsock专有的异步函数利用了Windows的消息驱动机制。异步函数调用只对启动操作负责,它也不等待操作完成,所以异步函数是不阻塞的,操作系统监视此操作的完成。当一个异步操作完成时,Windows给启动该异步操作的目标(通常是一个窗口)发送一个消息。,8.4.4WinSock编程,37,8、使用非阻塞Socket在缺省情况下,Berkeley和Winsock都是建立阻塞的Socket,当该Socket调用阻塞函数时,将引起阻塞。但用户可以调用Winsock的异步函数WSAAsyncSelect把一个Socket规定为非阻塞Socket。当用户用一个非阻塞Socket调用一个会引起阻塞操作的函数时,Winsock执行体总是在启动请求操作以前检查此函数是否可以立即完成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025甘肃省白银有色集团股份有限公司校园招聘225人笔试历年参考题库附带答案详解
- 2025春季首都机场集团校园招聘模拟试卷及答案详解(全优)
- 2025金华市天禾实业有限公司招聘2人考前自测高频考点模拟试题及答案详解一套
- 2025届春季东华公司校园招聘考前自测高频考点模拟试题及完整答案详解一套
- 2025年6月临沂高新控股集团有限公司三级子公司公开招聘管理人员笔试历年参考题库附带答案详解
- 2025年春季浙江省特种设备科学研究院招聘55人模拟试卷及答案详解(名师系列)
- 2025年春季中国邮政储蓄银行上海分行校园招聘模拟试卷及答案详解(网校专用)
- 2025贵州省自然资源厅直属事业单位第十三届贵州人才博览会引才8人模拟试卷附答案详解
- 2025年甘肃省平凉市泾川县丰台镇考聘大学生村文书考前自测高频考点模拟试题参考答案详解
- 2025黑龙江鸡西市博物馆现公益性岗位招聘2人考前自测高频考点模拟试题有答案详解
- 幼儿园大班数学《小熊种玉米》课件
- 公交车广告承包合同5篇
- 2025年秋新北师大版数学3年级上册全册同步教案
- 公共营养师考试题库(附答案)四级真题及答案
- 广东省深圳市福田区2024-2025学年八年级上学期语文期中考试试卷(含答案)
- SAP QM质量管理模块配置详解(S4系统)
- 机械制图选择题试题库及答案
- 医院安全警示教育
- 2025届名校名师模拟卷(九)语文试题(PDF版含答案)
- 技术部工作汇报与未来规划
- 学员游泳培训合同协议
评论
0/150
提交评论