网络编程实用教程第二版课件.ppt
《网络编程实用教程第二版课件.ppt》由会员分享,可在线阅读,更多相关《网络编程实用教程第二版课件.ppt(100页珍藏版)》请在三一办公上搜索。
1、网络编程实用教程第二版,2.1.1 问题的提出 站在应用程序实现的角度,应用程序如何方便地使用协议栈软件进行通信呢? 如果能在应用程序与协议栈软件之间提供一个软件接口,就可以方便客户与服务器软件的编程。,2.1 UNIX套接字网络编程接口的产生与发展,套接字应用程序编程接口是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称套接字编程接口(Socket API)。 它定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的方式、应用程序所能实现的功能、以及开发具有这些功能的程序的难度。,加州大学伯克利(Berkley)分校开发并推
2、广了一个包括TCP/IP互联协议的UNIX,称为BSD UNIX(Berkeley Software Distribution UNIX)操作系统,套接字编程接口是这个操作系统的一个部分。 后来的许多操作系统并没有另外搞一套其它的编程接口,而是选择了对于套接字编程接口的支持。 由于这个套接字规范最早是由Berkeley大学开发的,一般将它称为Berkeley Sockets规范。,2.1.2 套接字编程接口的起源与应用,微软公司以UNIX操作系统的Berkeley Sockets规范为范例,定义了Windows Socktes规范,全面继承了套接字网络编程接口。详细内容将在第三章介绍。Linu
3、x操作系统中的套接字网络编程接口几乎与UNIX操作系统的套接字网络编程接口一样。本章着重介绍三大操作系统的套接字网络编程接口的共性问题。,2.1.3 套接字编程接口在Windows和Linux操作系统中得到继承和发展,要想实现套接字编程接口,可以采用两种实现方式, 一种是在操作系统的内核中增加相应的软件来实现, 一种是通过开发操作系统之外的函数库来实现。,2.1.4 套接字编程接口的两种实现方式,UNIX操作系统对文件和所有其它的输入/输出设备采用一种统一的的操作模式,就是“打开-读-写-关闭”(open - read - write - close)的I/O模式。 当TCP/IP协议被集成到
4、UNIX内核中的时候,相当于在UNIX系统中引入了一种新型的I/O操作,就是应用程序通过网络协议栈来交换数据。,2.1.5 套接字通信与UNIX操作系统的输入/输出,在UNIX系统的实现中,套接字是完全与其他I/O集成在一起的。操作系统和应用程序都将套接字编程接口也看作一种输入/输出机制。 但是,用户进程与网络协议的交互作用实际要比用户进程与传统的I/O设备相互作用要复杂得多。,其次,使用套接字的应用程序必须说明许多细节。仅仅提供open、read、write、close四个过程远远不够。为避免单个套接字函数参数过多,套接字编程接口的设计者定义了多个函数。,2.2 套接字编程的基本概念,套接口
5、是对网络中不同主机上应用进程之间进行双向通信的端点的抽象,一个套接口就是网络上进程通信的一端,提供了应用层进程利用网络协议栈交换数据的机制。,图2.1 电插座与电话插座的作用,2.2.1 什么是套接字(SOCKET),我们应当从多个层面来理解套接字这个概念的内涵。 从套接字所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议栈进行通信的接口,是应用程序与网络协议栈进行交互的接口。,图2.2 应用进程、套接口、网络协议栈及操作系统的关系,从实现的角度来讲,非常复杂。套接字是一个复杂的软件机构,包含了一定的数据结构,包含许多选项,由操作系统内核管理。 从使用的角度来讲,非常简
6、单。对于套接字的操作形成了一种网络应用程序的编程接口(API)。 本书把这一套操作套接字的编程接口函数称作套接字编程接口,套接字是它的操作对象。 总之,套接字是网络通信的基石。,2.2.2 套接字的特点1通信域 接字存在于通信域中,通信域是为了处理一般的进程通过套接字通信而引入的一种抽象概念,套接字通常只和同一域中的套接字交换数据。 如果数据交换要穿越域的边界,就一定要执行某种解释程序。 现在,仅仅针对Internet域,并且使用Internet协议族(即TCP/IP协议族)来通信。,2套接字具有三种类型 每一个正被使用的套接字都有它确定的类型,只有相同类型的套接字才能相互通信。(1)数据报套
7、接字(Datagram SOCKET) 数据报套接字提供无连接的不保证可靠的独立的数据报传输服务。在Internet通信域中,数据报套接字使用UDP数据报协议形成的进程间通路,具有UDP协议为上层所提供的服务的所有特点。,图2.3 在Internet通信域中,数据报套接字基于UDP协议,(2)流式套接字(Stream SOCKET) 流式套接字提供双向的、有序的、无重复的、无记录边界的可靠的数据流传输服务。在Internet通信域中,流式套接字使用TCP协议形成的进程间通路,具有TCP协议为上层所提供的服务的所有特点,在使用流式套接字传输数据之前,必须在数据的发送端和接收端之间建立连接,如图2
8、.4所示。,图2.4 在Internet通信域中,流式套接字基于TCP协议,(3)原始式套接字(RAW SOCKET),原始式套接字允许对较低层次的协议,如IP、ICMP直接访问,用于检验新的协议的实现。,3套接字由应用层的通信进程创建,并为其服务 就是说,每一个套接字都有一个相关的应用进程,操作该套接字的代码是该进程的组成部分。,4使用确定的IP地址和传输层端口号,往往在生成套接字的描述符后,要将套接字与计算机上的特定的IP地址和传输层端口号相关联,这个过程称为绑定。 一个套接口要使用一个确定的三元组网络地址信息,才能使它在网络中唯一地被标识。,(1)不管是采用对等模式或者客户机/服务器模式
9、,通信双方的应用程序都需要开发。(2)双方所交换数据的结构和交换数据的顺序有特定的要求,不符合现在成熟的应用层协议,甚至需要自己去开发应用层协议,自己设计最适合的数据结构和信息交换规程。,2.2.3 套接字的应用场合,2.2.4 套接字使用的数据类型和相关的问题1三种表示套接字地址的结构 在套接字编程接口中,专门定义了三种结构型的数据类型,用来存储协议相关的网络地址,在套接字编程接口的函数调用中要用到它们。,(1)sockaddr结构,针对各种通信域的套接字,存储它们的地址信息。struct sockaddr unsigned short sa_family; / 地址家族char sa_da
10、ta; / 协议地址,(2)sockaddr_in结构,专门针对Internet通信域,存储套接字相关的网络地址信息,例如IP地址,传输层端口号等信息。struct sockaddr_in short int sin_family; / 地址家族unsigned short int sin_port; / 端口号struct in_addr sin_addr; / IP 地址unsigned char sin_zero8; / 全为0,(3)in_addr结构,专门用来存储 IP地址。Struct in_addr Unsigned long s_addrl;,(4)这些数据结构的一般用法: 首
11、先,定义一个Sockaddr_in的结构实例,并将它清零。比如:struct sockaddr_in myad;memset(,然后,为这个结构赋值,比如:myad.sin_family=AF_INET; myad.sin_port=htons(8080); myad.sin_addr.s_addr=htonl(INADDR-ANY);,第三步:在函数调用中使用时,将这个结构强制转换为sockaddr类型。如:accept(listenfd,(sockaddr*)(,2本机字节顺序和网络字节顺序 在具体计算机中的多字节数据的存储顺序,称为本机字节顺序。 多字节数据在网络协议报头中的存储顺序,称
12、为网络字节顺序。,网络应用程序要在不同的计算机中运行,本机字节顺序是不同的,但是,网络字节顺序是一定的。 所以,应用程序在编程的时候,在把IP地址和端口号装入套接字的时候,应当把它们从本机字节顺序转换为网络字节顺序;相反,在本机输出时,应将它们从网络字节顺序转换为本机字节顺序。,套接字编程接口特为解决这个问题设置了四个函数:htons() 短整数本机顺序转换为网络顺序,用于端口号。htonl() 长整数本机顺序转换为网络顺序,用于IP地址。,ntohs() 短整数网络顺序转换为本机顺序,用于端口号。ntohl() 长整数网络顺序转化为本机顺序,用于IP地址。 这四个函数将被转换的数值作为函数的
13、参数,函数返回值是转换后的结果。,3点分十进制的IP地址的转换 在因特网中,IP地址常常用点分十进制的表示方法,但在套接字中,IP地址是无符号的长整型数,套接字编程接口设置了两个函数,专门用于两种形式的IP地址的转换。,(1)inet-addr函数,unsigned long inet-addr( const char* cp)入口参数cp:点分十进制形式的IP地址。返回值: 网络字节顺序的IP地址,是无符号的长整数,,(2)inet_ntoa函数,char* inet_ntoa(struct in_addr in)入口参数in:包含长整型IP地址的 in_addr 结构变量,返回值: 指向点
14、分十进制IP地址的字符串的指针。,通常,我们使用域名来标识站点,可以将文字型的主机域名直接转换成IP地址,struct hostent* gethodtbyname( const char* name);入口参数:是站点的主机域名字符串,返回值: 是指向hostent 结构的指针,hostent结构包含主机名,主机别名数组,返回地址的类型(一般是AF-INET),地址长度的字节数,已符合网络字节顺序的主机网络地址等。,4域名服务,2.3 面向连接的套接字编程2.3.1 套接字的工作过程,2.3.2 UNIX套接字编程接口的系统调用1创建套接字SOCKET()SOCKET过程创建一个套接字并返回
15、一个整型描述符:int SOCKET( int Protofamily, int Type, int Protocol);,2绑定套接字到指定的地址 BIND(),int BIND( int Sockfd, struct sockaddr* My_addr, int Addrlen);,3启动监听Listen(),int LISTEN( int Sockfd, int Queuesize);,举例:LISTEN(Sockfe, 10);,图2.6 监听套接字使用缓冲区接纳多个客户端的连接请求,4接收连接请求ACCEPT()int ACCEPT(int Sockfd, struct sockad
16、dr* Addr, int* addrlen);举例:int clientfd; / 定义响应套接字描述符变量int addrler=sizeof(sockaddr); / 获得套接字地址结构长度。struct sockaddr_in cltsockaddr; / 定义用于返回客户端地址的结构。clientfd=ACCEPT(listenfd, (sockaddr* )( / 接收客户连接请求,5请求建立连接CONNECT()int CONNECT( int Sockfd, struct sockaddr* Service_addr, int Addrlen);举例:if (CONNECT(s
17、ockfd, (struct sockaddr*)(&serv_addr),sizeof(struct sockaddr)0) 报错,并退出 ,6读/写套接字READ()和WRITE()int READ( int sockfd, void* buffer, int len );int WRITE( int sockfd, void* buffer, int len ),7向套接字发送 SEND() 和从套接字接收 RECV(),int SEND( int sockfd, char* buf, int len, int flags );int RECV( int sockfd, char* bu
18、f, int len, int flags );,8关闭套接字CLOSE(),int CLOSE( int sockfd );,2.3.3 面向连接的套接字编程实例1实例的功能 服务器对来访的客户计数,并向客户报告这个计数值。 客户建立与服务器的一个连接并等待它的输出。 每当连接请求到达时,服务器生成一个可打印的ASCII串信息,将它在连接上发回,然后关闭连接。 客户显示收到的信息,然后退出。,例如,对于服务器接收的第10次客户连接请求,该客户将收到并打印如下信息:This server has been contacted 10 times.,2实例程序的命令行参数 实例是UNIX环境下的C
19、程序,客户和服务器程序在编译后,均以命令行的方式执行。 服务器程序执行时可以带一个命令行参数,是用来接受请求的监听套接字的协议端口号。这个参数是可选的。如果不指定端口号,代码将使用程序内定的缺省端口号5188。,客户程序执行时可以带两个命令行参数:一个是服务器所在计算机的主机名,另一个是服务器监听的协议端口号。 这两个参数都是可选的。 如果没有指定协议端口号,客户使用程序内定的缺省值5188。 如果一个参数也没有,客户使用缺省端口和主机名localhost,localhost是映射到客户所运行的计算机的一个别名。 允许客户与本地机上的服务器通信,对调试是很有用的。,3客户程序代码/*-* 程序
20、: client.c* 目的: 创建一个套接字,通过网络连接一个服务器,并打印来自服务器的信息* 语法: client host port * host - 运行服务器的计算机的名字* port - 服务器监听套接字所用协议端口号* 注意:两个参数都是可选的。如果未指定主机名,客户使用localhost;如果未指定端口号, * 客户将使用PROTOPORT中给定的缺省协议端口号*-*/,#include #include /* UNIX下,套接字的相关包含文件。*/#include #include #include #include #include #define PROTOPORT 51
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 实用教程 第二 课件
链接地址:https://www.31ppt.com/p-1592106.html