数据通信笫二十二讲Socket编程.ppt_第1页
数据通信笫二十二讲Socket编程.ppt_第2页
数据通信笫二十二讲Socket编程.ppt_第3页
数据通信笫二十二讲Socket编程.ppt_第4页
数据通信笫二十二讲Socket编程.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

数据通信与计算机网络(第二版 ) 电子教案 笫二十二讲 Socket编程 1 本讲内容 第八章 运输层 8.4 Socket编程 8.4.1 Socket接口概念 8.4.2 Socket编程模型 8.4.3 Unix Socket编程 8.4.4 WinSock编程 2 8.4.1 Socket接口概念 Socket接口是TCP/IP网络通信的API。它规定了 许多函数和例程,程序员可以用它们来开发 TCP/IP网络上的应用程序。 网间进程通信 不同主机进程间的相互通信。 端口 网络中可以被命名和寻址的通信端点,是操作系统可 分配的一种资源,用于标识通信的进程(如TCP或 UDP端口)。 端口类似于文件描述符,端口操作类似于一般的I/O操 作。 进程在使用端口前需要将自己与该端口号联系起来(绑定)。 3 8.4.1 Socket接口概念 端口号有两种基本分配方式 全局分配 由一个公认的中央机构统一管理和分配,并将结果公布于众( 著名端口)。 TCP和UDP规定,小于1024的端口号作为全局分配的保留端 口。 如21、80、110等。 本地分配(动态连接) 进程需要访问传输层服务时,向本地操作系统提出申请,操作 系统返回一个本地唯一的端口号。 TCP和UDP规定,大于1024的端口号用于本地分配的自由端 口。 TCP/IP端口号的分配综合了上述两种方式。 4 8.4.1 Socket接口概念 地址 网络通信中通信的两个进程分别在不同的机器上。 主机上的进程通过三级寻址: 网络地址; 网络上的主机地址; 主机上的进程标识。 TCP/IP主机地址由网络ID和主机ID组成(32位IP地址 );进程标识使用端口号(16位)。 网络字节顺序 为保证数据的正确性,在网络协议中须指定网络字节 顺序。 TCP/IP使用16比特整数和32比特整数的高价先存格式 。 5 8.4.1 Socket接口概念 连接 两个进程间的通信链路称为连接。 连接在内部表现为一些缓冲区和一组协议机制,在外 部表现出比无连接高的可靠性。 半相关 网络中在全局唯一标识一个进程的三元组:(协议,本 地地址,本地端口号)。 它指定连接的每半部分。 全相关 标识一个完整的网间通信的五元组:(协议,本地地址 ,本地端口号,远地地址,远地端口号)。 即两个协议相同的半相关组合成一个合适的相关,即 完全组成一连接。 6 8.4.1 Socket接口概念 服务方式 “服务”是描述相邻层之间关系的抽象概念,即网络中各 层向紧邻上层提供的一组操作。 下层是服务提供者,上层是请求服务的用户。 服务的表现形式是原语(primitive),如系统调用或库 函数。 TCP/IP传输层以不同的服务方式提供“端到端”通信。 面向连接和无连接服务 TCP提供面向连接的字节流服务。 UDP提供无连接的数据报服务。 顺序 指接收数据顺序与发送数据顺序相同。 TCP提供顺序服务。 7 8.4.1 Socket接口概念 差错控制 保证应用程序接收的数据无差错的一种机制。 如校验 和、确认等。 TCP提供差错控制服务。 流控制 在数据传输过程中控制数据传输速率的一种机制,以 保证数据不被丢失。 TCP提供流控制服务。 字节流 仅把传输中的数据段看作是一个字节序列,不提供数 据流的任何边界。 TCP提供字节流服务。 8 8.4.1 Socket接口概念 数据报 接收方要保存发送方的数据报边界。 UDP提供数据报服务。 全双工/半双工 端-端间数据同时以两个方向/一个方向传送。 TCP/IP的端到端通信是全双工的。 缓存 TCP/IP运输实体具备缓存能力。 紧急数据 TCP支持紧急数据功能。 9 8.4.1 Socket接口概念 在TCP/IP网络应用中,通信的两个进程间相互作 用的主要模式是客户/服务器(Client/Server, C/S)模式 客户向服务器发出服务请求,服务器接收到请求后, 提供相应的服务。 C/S模式的建立基于以下两点: 建立网络的起因是网络中软硬件资源、运算能力和信 息不均等,需要共享 。 网间进程通信完全是异步的。 10 8.4.1 Socket接口概念 C/S模式在操作过程中采取的是主动请求方式 服务器方(进程)先启动,并根据请求提供相应服务 a) 打开一通信通道并告知本地主机,它愿意在某一端 口上(如HTTP使用80)接收客户请求; b) 等待客户请求到达该端口; c) 接收到重复服务请求,处理该请求并发送应答信号 ;接收到并发服务请求,激活一新进程来处理这个 客户请求。服务完成后,关闭此新进程与客户的通 信链路,并终止。 d) 返回第二步,等待另一客户请求。 e) 关闭服务器。 11 8.4.1 Socket接口概念 客户方(进程) a) 打开一通信通道,并连接到服务器所在主机的特定 端口; b) 向服务器发服务请求报文,等待并接收应答;继续 提出请求 c) 请求结束后关闭通信通道并终止。 从上面所描述过程可知: 客户与服务器进程的作用是非对称的,因此编码不 同。 服务进程一般是先于客户请求而启动的。只要系统 运行,该服务进程一直存在,直到正常或强迫终止 。 12 8.4.1 Socket接口概念 TCP/IP socket提供三种类型套接字 流式(stream)套接字 提供面向连接、可靠的数据流传输服务,数据无差错 、无重复地发送,且按发送顺序接收。 数据报式(datagram)套接字 提供无连接服务。数据包以独立包形式被发送,不提 供无错保证,数据可能丢失或重复,并且接收顺序混 乱。 原始式(raw)套接字 允许对较低层协议,如IP、ICMP直接访问。 13 8.4.2 Socket编程模型 Socket网络通信模型 网络通信最终是由两台主机上的两个进程完成,通过 网络传递它们之间的数据,它实现的是网络间进程通 信。 网络通信对话的每一端称为一个端点,当使用Socket 接口对网络通信编程时,Socket是网络通信过程中端 点的抽象表示。 实践中,Socket由主机地址和TCP/UDP端口号等组成 。为了通过Socket接口进行网络通信,程序在网络对 话的每端都需要一个Socket。 两个Socket之间的通信可以是面向连接的(点对点连接 ,实现TCP通信)也可以是无连接的(实现UDP通信)。 14 8.4.2 Socket编程模型 从网络的角度看,Socket是通信连结的端点;从程序 设计者的角度看,Socket是编写网络通信程序的API。 Socket接口使用Unix系统传统的I/O命令集处理模式 ,即“打开-读-写-关闭(open-read -write -close)”这样 的处理过程。 15 8.4.3 Unix Socket编程 Unix下许多网络调用都需要一个变元,该变元是 指向Socket地址结构的指针。 在中定义: struct sockaddr 在中定义: struct in_addr struct sockaddr_in 16 8.4.3 Unix Socket编程 1、建立一个Socket 为了进行网络I/O,第一件事就是建立Socket。 它调用Socket函数,指定所要求的协议的类型 (TCP/UDP/IP等),返回一个类似文件描述符的句柄: Socket_handler = socket(int family,int type,int protocol) 调用Socket函数时,Socket执行体将建立一个Socket ,并返回一个指向描述符表入口的Socket句柄(或描 述符)。Socket执行体为用户管理描述符表。访问描 述符表的唯一途径是通过Socket描述符。 在通信完成之后,用户应该通过调用close函数来关闭 Socket,释放所分配的资源: Result = close(int sock_handle) 17 8.4.3 Unix Socket编程 2、配置Socket 面向连接的客户程序使用connect 函数来配置 Socket。 connect函数要求用户指定一个Socket句柄、一个包含 远地主机信息的地址结构和此地址结构的长度: Result = connect(int socket_handle, struct sockaddr *servaddr, int addrlen) 由于无连接客户程序没有和远地主机建立直接连接, 所以它必须对协议端口进行侦听,以便接收对它的服 务请求所产生的数据报应答。同样,为了接收客户的 请求,服务器程序必须对一个特定的协议端口进行侦 听。Socket API中的bind函数让程序将一个本地地址( 包括主机地址和协议端口)和一个Socket联系起来: Result = bind(int socket_handle, struct sockaddr *myaddr, int addrlen) 18 8.4.3 Unix Socket编程 3、通过Socket传输数据 通过一个连接的Socket发送数据 使用面向连接数据的Socket API函数不需要目的地址而 使用Socket句柄作为其参数: Result = write(int socket_handle, chat *message_buffer, int buffer_length); Result = writev(int socket_handle, struct iovec io_vector, int iovcount); Result = send(int socket_handle, char *buffer, int bufflen, int special_flags) 这三个函数都返回一个整数值:如果正确执行,函数 将返回传送的字节数;如果发生错误,函数返回-1。 19 8.4.3 Unix Socket编程 通过一个无连接的Socket发送数据 为了通过一个无连接的Socket发送数据,可以使用 sendto和sendmsg这两个Socket API函数。 Result = sendto(int socket_handle, char *buffer, int buflen, int flags, struct sockaddr *to, int addrlen); Result = sendmsg(int socket_handle, struct msghdr *msg, int special_flags) sendmsg 函数传输数据时,让用户使用一个报文结构 而不是一个简单的数据缓冲区。 20 8.4.3 Unix Socket编程 通过Socket接收数据 Socket接口包括五个与传送数据函数相对应的接收函 数(read,readv,recv,recvfrom,recvmsg)。对应的 传送接收函数使用同样的参数。 Result = read(int sock_handle,chat* buffer,int length); Result = readv(int sock_handle,struct iovec iov, int iovcount); Result = recv(int sock_handle,char *buf,int len,int flags); Result = recvfrom(int sock_handle,char *buf,int len ,struct sockaddr *fromaddr,int fromlen) ; Result = recvmsg(int sock_handle,struct msghdr *msg,int flags) 21 8.4.3 Unix Socket编程 4、服务器的Socket使用 面向连接的服务器需要调用listen和accept函数。 listen函数先将服务器置于被动的侦听模式,accept函 数接着建立一个Socket连接。 listen函数将所有到达的服务请求在一个请求队列上排 队,也就是说,listen函数让Socket执行体建立一个输 入数据队列,将到达的服务请求保存在此队列上,直 到程序处理它们为止。 Result = listen(int socket_handle,int query_length) accept函数让服务器接收客户的连接请求。在建立好输 入队列以后,服务器就调用accept函数,然后睡眠,并 等待客户的连接请求。 Result = accept(int socket_handle, struct sockaddr *addr, int length) 22 8.4.3 Unix Socket编程 write( ) 面向连接的服务器 socket( ) bind( ) listen( ) accept( ) 阻塞直到收到一个客户 的连接建立请求为止 read( ) 处理服务请求 write( ) 面向连接的客户 socket( ) read( ) connect( ) 协商连接 数据(请求) 数据(应答) 通信完毕 close( ) 通信完毕 close( ) 5、Socket编程大致流程 面向连接通信 23 8.4.3 Unix Socket编程 recvfrom( ) 无连接的服务器 socket( ) bind( ) recvfrom( ) 阻塞直到从客户收到数据为止 处理服务请求 sendto( ) 无连接的客户 socket( ) sendto( ) bind( ) 数据(请求) 数据(应答) 通信完毕 close( ) 通信完毕 close( ) 无连接通信 24 8.4.3 Unix Socket编程 6、I/O多路复用 Unix系统中提供select系统调用来实现。 用户进程使用这种系统调用等待几种事件发生,一旦 这几种事件中任何一种发生,内核将用户进程唤醒。 int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) 25 8.4.3 Unix Socket编程 7、一些有用的库函数 字节顺序转换 u_long htonl(u_long hostlong); u_short htons(u_short hostshort); u_long ntohl(u_long hostlong); u_short ntohs(u_long hostshort) 地址转换 unsigned long inet_addr(char *ptr); char *inet_ntoa(struct in_addr inaddr) 地址-地址转换 struct hostent *gethostbyname(char *hostname); struct hostent *gethostbyaddr(char *addr,int len,int type); struct servent *getservbyname(char servname,char* protname) 26 8.4.3 Unix Socket编程 一个例子 客户方给服务方发送数据,服务方把接收到的 数据显示出来。 27 8.4.4 WinSock编程 Windows Sockets(Winsock)是一个基于 Socket模型的API。 Windows API 只在Microsoft Windows操作系统类(包 括Microsoft Windows 95/NT/2000/XP等)中使用。 Winsock是以动态链接库(DLL)来实现Socket 接口的 。 Winsock规范将API库分为三类: Winsock API包含的Berkeley Socket 函数 检索有关域名、通信服务和协议等Internet信息的数据 库函数 Berkeley Socket 例程的Windows专用的扩展函数 28 1、包含一个新的头文件 在Windows环境下,编写网络程序时,需要头文 件Winsock.h。但不需要再包含Windows.h头文件 。 8.4.4 WinSock编程 29 8.4.4 WinSock编程 2、Winsock 的初始化和清除 Windows Socket要求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); 33 6、使用Socket Winsock数据传输函数:send和sendto函数用于 数据传送,recv和recvfrom函数用于数据接收。 如果函数执行成功,将返回实际传输的字节数。 send和recv函数只用于连接的Socket,而其它函数不 受限制。 使用一个连接的Socket Result = send(socket_handle, message_buffer, buffer_length, special_flags); Result = recv(socket_handle, message_buffer, buffer_length, special_flags) 8.4.4 WinSock编程 34 使用一个无连接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.4 WinSock编程 35 7、阻塞函数、非阻塞函数和异步函数 Winsock将函数分为阻塞函数和非阻塞函数。 阻塞函数在完成其网络操作之前禁止用户程序调用其 它Winsock函数。 非阻塞函数要么立即完成其操作要么返回一个错误信 息,它不等待其工作完成。 Winsock专有的异步函数利用了Windows的消息 驱动机制。 异步函数调用只对启动操作负责,它也不等待操作完 成,所以异步函数是不阻塞的,操作系统监视此操作 的完成。 当一个异步操作完成时,Windows给启动该异步操作 的目标(通常是一个窗口)发送一个消息。 8.4.4 WinSock编程 36 8、使用非阻塞Socket 在缺省情况下,Berkeley和Winsock都是建立阻 塞的Socket,当该Socket调用阻塞函数时,将引 起阻塞。但用户可以调用Winsock的异步函数 WSAAsyncSelect把一个Socket规定为非阻塞 Socket。 当用户用一个非阻塞Socket调用一个会引起阻塞操

温馨提示

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

评论

0/150

提交评论