《网络应用程序设计》课件第2章 基于TCP套接字的编程.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《网络应用程序设计》课件第2章 基于TCP套接字的编程.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络应用程序设计 网络应用程序设计课件第2章 基于TCP套接字的编程 网络 应用 程序设计 课件 基于 TCP 套接 编程
- 资源描述:
-
1、第第2章章 基于基于TCP套接字的编程套接字的编程 第第2章章 基于基于TCP套接字的编程套接字的编程 2.1 概述概述 2.2 套接字和套接字地址套接字和套接字地址2.3 基本套接字函数基本套接字函数2.4 高级套接字函数高级套接字函数2.5 多路复用多路复用2.6 网络字节传输顺序及主机字节顺序网络字节传输顺序及主机字节顺序2.7 DNS与域名访问与域名访问2.8 基于基于IP和域名的通信编程和域名的通信编程2.9 基于基于TCP套接字编程示例套接字编程示例习题习题第第2章章 基于基于TCP套接字的编程套接字的编程 2.1 概述20世纪80年代早期,美国国防高级研究计划局(ARPA,Adv
2、anced Research Projects Agency)资助了加利福尼亚大学伯克利分校一个研究组,将TCP/IP 软件移植到UNIX操作系统中,并将结果提供给其他网点。作为项目的一部分,设计者们希望像访问文件一样去访问网络,因此,创建了一个接口,应用进程使用这个接口可以方便的进行通信。为了支持TCP/IP功能增加的新系统调用接口,形成了Berkeley Socket,这个系统被称为Berkeley UNIX或BSD UNIX(TCP/IP首次出现在BSD 4.1版本(release 4.1 of Berkeley Software Distribution)。由于许多计算机厂商都采用了B
3、erkeley UNIX,Socket得到了迅速普及并被广泛使用。第第2章章 基于基于TCP套接字的编程套接字的编程 在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程接口套接字在网络软件中也被广泛应用,至今已引进到Linux和Windows系统中,成为开发网络应用软件的强有力工具,本章将详细讨论套接字的使用。Linux产生时,UNIX系统的网络功能已经相当成熟了,Linux网络的开发者选择了重新开发网络功能。在L
4、inux网络代码开发的过程中,很多程序员做出了贡献。它提供的套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字(SOCK_RAW)。下面将详细介绍这些套接字的定义与应用。第第2章章 基于基于TCP套接字的编程套接字的编程 2.2 套接字和套接字地址 2.2.1 套接字套接字套接字是两个通信通道上的端节点。套接字函数可以用来产生通信信道,通过信道两个应用程序间可以传送数据。图2-1显示了利用套接字进行通信的示例。第第2章章 基于基于TCP套接字的编程套接字的编程 socketsocket函数应用程序应用程序函数网络协议管套管套ServerCl
5、ient网络通信信道(a)(b)图2-1 套接字(a)套接字作为网络传输端点;(b)套接字对多种协议的支持第第2章章 基于基于TCP套接字的编程套接字的编程 套接字是信道的末端,当应用程序产生一个套接字后,套接字函数就返回所用文件的描述符。在这里,可以把支持虚电路服务的信道看做电话线,套接字就像一个电话。同样,可以把提供数据报服务的信道看做邮局系统,套接字看做信箱,人们可以向邮箱投递信件,信件通过邮局系统到达另一个信箱。应用程序利用套接字发数据报,数据报通过信道传向另一个套接字。在产生信道时,用户可以指定所用的传输提供者。例如,可以用TCP、UDP、XNS作传输提供者。第第2章章 基于基于TC
6、P套接字的编程套接字的编程 Linux支持多种类型的套接字,也叫做套接字寻址簇,这是因为每种类型的套接字都有自己的寻址方法。Linux支持以下的套接字类型:UNIX UNIX域套接字INET Internet地址簇CP/IP协议支持通信IPX Novell IPXAPPLETALK Appletalk DDPX25 X25这些类型的套接字代表各种不同的连接服务。第第2章章 基于基于TCP套接字的编程套接字的编程 Linux的BSD 套接字支持下面的几种套接字类型:(1)流式(stream)。这种套接字提供了可靠的双向顺序数据流连接。它可以保证数据传输中的完整性、正确性和单一性。INET寻址簇中
7、的TCP协议支持这种类型的套接字。(2)数据报(datagram)。这种类型的套接字也可以像流式套接字一样提供双向的数据传输,但它们不能保证传输的数据一定能够到达目的节点,也无法保证到达数据以正确的顺序到达以及数据的单一性、正确性。UDP协议支持这种类型的套接字。(3)原始(raw)。这种类型的套接字允许进程直接存取下层的协议。(4)可靠递送消息(reliable delivered messages)。这种套接字和数据报套接字一样,只能保证数据的到达。第第2章章 基于基于TCP套接字的编程套接字的编程(5)顺序数据包(sequenced packets)。这种套接字和流式套接字相同,但是它的
8、数据包的大小是固定的。(6)数据包(packet)。这不是标准的BSD套接字类型,而是Linux中的一种扩展。它允许进程直接存取设备层的数据包。套接字的特点:(1)套接字没有与它相连的设备文件。应用程序可以用scoket()产生套接字,指定所用的信道类型。scoket()返回与所用信道末端相适应的文件描述符。(2)只要进程保存文件描述符,套接字就一直存在,直到没有进程打开文件描述符为止,套接字才被撤消。第第2章章 基于基于TCP套接字的编程套接字的编程(3)可以产生一个套接字,也可以同时产生一对套接字。如果产生一对套接字,则操作系统会自动在它们之间建立信道。如果只产生一个套接字,则用户程序就需
9、要用套接字函数在该套接字与其他套接字间建立信道。因此,socket是一个工具,或者说是一种不可见控件,应用程序可以通过socket函数,来访问底层网络协议。第第2章章 基于基于TCP套接字的编程套接字的编程 2.2.2 套接字地址套接字地址 套接字接口利用传送提供者进行工作,不同的传送提供者有不同的地址,套接字接口允许指定任意类型的地址。Linux系统的套接字是一个通用的网络编程接口,它支持多种协议,每一种协议使用不同的套接字地址结构。Linux系统定义了一种通用的套接字地址结构,可以保持套接字函数调用参数的一致性。如下所示:struct sockaddr unsigned short sa_
10、family;/*地址类型,AF_xxx*/char sa_data14;/*协议地址*/;第第2章章 基于基于TCP套接字的编程套接字的编程 其中:sa_family:保存协议标识符。AF_INET:代表TCP/IP协议簇。sa_data:保存具体的协议地址。TCP/IP协议簇的套接字地址也可以采用如下结构:#include#include第第2章章 基于基于TCP套接字的编程套接字的编程 struct in_addr _u32 s_addr;/*UINT类型*/struct sockaddr_in short int sin_family;/*地址类型:AF_XXX*/unsigned s
11、hort int sin_port;/*端口号*/struct in_addr sin_addr;/*Internet 地址*/unsigned char sin_zero8;;第第2章章 基于基于TCP套接字的编程套接字的编程(3)sin_port和sin_addr必须保证以网络字节顺序传输。(4)IP地址作为参数传送时,注意addr.sin_addr与 a d d r.s i n _ a d d r.s _ a d d r 之 间 的 差 别。addr.sin_addr形式引用的是struct sin_addr结构类型的数据,addr.sin_addr.s_addr形式的引用是整数类型的数
12、据。(5)由于和是Linux特有的头文件,为了能够保持代码的可移植性,在程序中不要直接包含它们,而与平台无关的、包含了它们。因此,程序中应该包含这两个头文件。第第2章章 基于基于TCP套接字的编程套接字的编程 2.2.3 IP地址的使用地址的使用在设置sockaddr_in类型的地址时,需要进行字符串形式的IP地址和二进制形式的地址间的转换,有如下一系列的函数可以处理IP地址的转换:#include#include#include int inet_aton(const char*cp,struct in_addr*inp);unsigned long int inet_addr(const
13、char*cp);char*inet_ntoa(struct in_addr in);第第2章章 基于基于TCP套接字的编程套接字的编程 这几个函数将点分十进制数字形式表示的IP地址与32位的网络字节顺序的二进制形式的IP地址进行转换。例如,可以使用inet_addr()程序把诸如“192.168.5.10”形式的IP地址转化为无符号的整型数C0A8000A。函数inet_addr和inet_aton功能相同,函数inet_addr已过时,编程时应使用函数inet_aton。也可以调用inet_ntoa()把地址转换成数字和句点的形式:printf(%s,inet_ntoa(ina.sin_a
14、ddr);这将会打印出IP地址。它返回的是一个指向字符串的指针。例如:第第2章章 基于基于TCP套接字的编程套接字的编程 char*a1,*a2;a1=inet_ntoa(ina1.sin_addr);/*这是192.92.129.1的二进制形式*/a2=inet_ntoa(ina2.sin_addr);/*这是132.241.5.10的二进制形式*/printf(address 1:%sn,a1);printf(address 2:%sn,a2);输出如下:address 1:192.92.129.1address 2:132.241.5.10第第2章章 基于基于TCP套接字的编程套接字的编
15、程 2.3 基本套接字函数 在各种网络编程接口中,socket脱颖而出,越来越得到大家的重视,这是因为socket规范是一套开放的、支持多种协议的网络编程接口。经过不断发展和完善,并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为网络编程的事实上的标准。下面给出套接字函数及其使用方法。1socket()在利用套接字进行网络通信时,进程要做的第一件事就是调用socket(),产生一个套接字,并指明将要使用的通信协议,如TCP、UDP、XNS、SPP等。第第2章章 基于基于TCP套接字的编程套接字的编程#include#include in
16、t socket(int family,int type,int protocol);socket()返回一文件描述符,从应用的角度讲,该文件描述符是指通信信道的末端。如果调用失败,则返回-1。其中参数定义为:family:表示所用的协议是协议簇中的哪一个。协议簇是有相同地址格式的一组传送提供者。例如,TCP和UDP有同样的地址格式,因此它们属于同一协议簇。family的值可以为:第第2章章 基于基于TCP套接字的编程套接字的编程 AF_INET:TCP/IP协议集合。AF_UNIX:UNIX域协议簇,在本机的进程间通信时使用。AF_ISO:ISO协议簇。type:表示套接字类型:sock_S
17、TREAM:提供虚电路服务的流套接字。sock_DGRAM:提供数据报服务的套接字。sock_RAW:原始套接字,只对Internet协议有效,可以用来直接访问IP协议。sock_SEQPACKET:有序分组套接字。sock_RDM:能可靠交付信息的数据报套接字。第第2章章 基于基于TCP套接字的编程套接字的编程 protocol:表示指定所用协议。对于大多数应用protocol都被设置为0,表示使用默认协议。但是,如果对给定的family及服务类型有多种协议可选,就须指定所用协议。例如,套接字要用TCP协议。因为TCP是TCP/IP协议集合中的一员,要用这个协议簇,应将family设为AF_
18、INET。TCP/IP支持虚电路服务,故应将第二个参数types设为SOCK_STREAM。因为TCP是TCP/IP协议集合中惟一提供虚电路服务的传送提供者,所以protocol可以设为0。socket()调用为:int fd;fd=socket(AF_INET,SOCK_STREAM,0);第第2章章 基于基于TCP套接字的编程套接字的编程 又例如,用UDP协议,支持数据报服务。因为UDP属于TCP/IP协议簇,是TCP/IP协议集合中仅有的提供数据报服务的传输提供者,所以,protocol设置为0。该socket()调用为:int fd;fd=socket(AF_INET,SOCK_DGR
19、AM,0);例如,产生一个套接字,访问TCP/IP协议集合的低层协议,可将套接字类型设为SOCK_RAW,这样允许访问低层协议,包括IP和ICMP。要让产生的套接字直接访问IP,protcol应设为IPPROTO_RAW。socket()调用为:int fdfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);第第2章章 基于基于TCP套接字的编程套接字的编程 调用socket函数时,socket执行体将建立一个socket,并返回一个指向描述符表入口的socket句柄。实际上创建一个socket意味着为一个socket数据结构分配存储空间,如图2-2所示。第第2章章
20、 基于基于TCP套接字的编程套接字的编程 协议簇服务类型本地IP地址远地IP地址本地协议端口号指向Internet结构远地协议端口号图2-2 socket数据结构第第2章章 基于基于TCP套接字的编程套接字的编程 表2-1给出了适应AF_INET及AF_UNIX协议簇的type及protocol的属性取值。第第2章章 基于基于TCP套接字的编程套接字的编程 表2-1 AF_INET 及 AF_UNIX协议簇的type及protocol的属性取值family type protocol 结 果 AF_INET SOCK_STREAM 0 TCP AF_INET SOCK_STREAM IPPRO
21、TO_TCP TCP AF_INET SOCK_DGRAM 0 UDP AF_INET SOCK_DGRAM IPPROTO_UDP UDP AF_INET SOCK_RAW IPPROTO_ICMP ICMP AF_INET SOCK_STREAM IPPROTO_RAW IP AF_INET SOCK_SEQPACKET ANY 不用 AF_INET SOCK_RDM ANY 不用 AF_INET SOCK_STREAM 0 面向连接的循环服务提供者 AF_UNIX SOCK_DGRAM 0 面向无连接的循环服务提供者 AF_UNIX SOCK_RAW ANY 不用 AF_UNIX SOC
22、K_SEQPACKET ANY 不用 AF_UNIX SOCK_RDM ANY 不用 第第2章章 基于基于TCP套接字的编程套接字的编程 2socketpair()socketpair()产生两个套接字,连接这两个套接字,然后返回相应的文件描述符,它也称为UNIX域套接字。其调用格式为:#include#include int socketpair(int family,int type,int protocol,int fd_array2);函数socketpair()返回两个套接字描述符:socket0和socket1,与管道pipe相似,只是socketpair()返回一对套接字描述符,
23、而不是文件描述符。socketpair()返回的两个套接字描述符是双向的,而管道是单向的。第第2章章 基于基于TCP套接字的编程套接字的编程 Family、type、protocol参数含义与socket()函数一样,但是 socket()返回一个无连接套接字的文件描述符,socketpair()返回两个连接好的套接字。调用成功返回2,否则返回-1。family只能取值AF_UNIX,由于此系统调用仅用于UNIX支配协议,因此只有两种可用形式。一种是:int rc,fd_array2;rc=socketpair(AF_UNIX,SOCK_STREAM,0,fd_array);第第2章章 基于基
24、于TCP套接字的编程套接字的编程 socketpair()用SVR4 面向连接的传输提供者之一产生一个通信信道。另一种是:int rc,fd_array2;rc=socketpair(AF_UNIX,SOCK_DGRAM,0,fd_array);这里,函数socketpair()用无连接的传输提供者产生一个通信信道。下面的函数可以用来生成一个域套接字间的通信信道。#include#include/*如果成功,则返回0,否则返回-1*/*用fd返回两个文件描述符*/第第2章章 基于基于TCP套接字的编程套接字的编程 int fd2;return(socketpair(AF_UNIX,SOCK_S
25、TREAM,0,fd);3bind()调用socket函数创建套接字后,存在一个名字空间,但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字句柄联系起来,即将名字赋予套接字,以指定本地址中的协议,本地地址,本地端口。其调用格式如下:#include#include int=bind(int fd,struct sockaddr*addressp,int addrlen);第第2章章 基于基于TCP套接字的编程套接字的编程 其中:fd:由socket()函数返回的套接字描述符。addressp:向协议传送地址的指针,包含有关的地址信息:名称、端口和IP地址
展开阅读全文