Linux环境下基于UDP的socket编程浅析.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Linux环境下基于UDP的socket编程浅析.pdf》由会员分享,可在线阅读,更多相关《Linux环境下基于UDP的socket编程浅析.pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、632 0 0 6.1应 用 安 全0 引言L i n u x 是一个诞生于I n t e r n e t 和WWW的产品,它具有稳定、简易、高效、兼容性好等特点,并且支持多种网络协议,如 I p v 4、I p v 6、X.2 5、I P X、N E T B I OS、DDP等。套接字(s o c k e t)是介于网络应用层和传输层之间的编程接口,套接字接口提供了访问下层通信协议的大量系统调用和相应的数据结构,进程在 L i n u x 上的网络通信过程就是使用套接字传输数据的过程。套接字在U D P/I P网络模型中的地位如图 1 所示。1 B S D套接字接口s o c k e t 最
2、早应用于伯克莱大学B S D U N I X中,所以习惯上又称其为B S D s o c k e t。一个套接字描述为一个通信连接的一端,在一个通信连接中的两端通信程序应各自有一个套接字来描述它们自己那一端,不同主机中的两个进程通过各自的套接字发送和接收消息,从而实现进程间跨网络的通信。L i n u x 环境中套接字支持多种网络协议,不同类型网络协议具有不同的工作方式,所使用的地址格式也完全不同。对于各种网络协议而言,使用相同地址格式的几个协议称为一个协议地址簇,表 1 列出了 B S D套接字的常见地址族。表1 B S D套接字地址族的主要类型L i n u x 将套接字地址族抽象为统一的
3、B S D套接字接口,该接口是应用程序的开发接口,由各地址族专有的软件支持。L i n u x B S D s o c k e t 支持以下常见套接字类型:(1)S OCK_ S T RE AM(数据流套接口):提供一个面向连接的双工顺序数据流传输和可靠的数据传输服务。这种套接字可以保证数据传输的可靠性,不会出现数据丢失、破损或重复出现等差错,而且通过流量控制避免发送的数据流超限。I n t e r n e t 地址中的 T C P协议支持流套接字。(2)S OCK_ DGRAM(数据报套接口):提供一个无连接和不可靠的双工数据传输服务。数据包以独立包形式被发送和接收。不对数据的传输提供无错保
4、证,即数据可能被丢失、破坏,也可能被重复接收。I n t e r n e t 地址中的UDP协议支持这种套接字。(3)S OCK_ RAW(原始套接口):这种类型的套接字允许对低层协议如 I P或 I C MP直接访问,可以直接填充 I P、T CP、UDP或者 I CMP的包头,发送用户自己定义的 I P包或者 I CMP包,主要用于协议的开发。2 用户数据报协议 UDP及无连接服务I n t e r n e t 给分布式应用程序提供两类服务:一是面向连接的服务,二是无连接服务。面向连接的服务由 TCP提供,客户和服务器在彼此间发送数据之前要先建立三次握手,以确保发送端的数据最终按顺序完整无
5、误地传送给接收端。无连接服务则由 U D P提供,发送端和接收端在传送数据之前不需要进行握手,因而不会带入任何延迟。在无连接模式下,客户程序没有把套接字固定连接到一个指定的远程端点上,而是在每次发送数据报时指定远程目的地。因而 U D P具有相当的灵活性:客户程序可以在它要求发送时才决定和哪个服务器交互。从图1 可以看出,U D P作者简介:吴佩贤(1 9 7 4-),男,讲师,主要从事实时操作系统研究。摘要:s o c k e t 适用于网络环境中的进程间通信,它已成为当前许多操作系统的网络 AP I,也是网络操作系统中必不可少的基础功能。尽管U D P无法像T C P一样提供可靠的数据传输
6、,但U D P并不比T C P缺乏优越性。随着L i n u x操作系统和I n t e r n e t 的不断发展,L i n u x 网络环境下尤其是基于U D P的s o c k e t 通信技术仍广为注目。文章介绍了L i n u x 平台下的s o c k e t 及其编程原理,并通过一个J a v a 编写的基于U D P的客户/服务器程序,描述了网络中不同主机上的两个进程之间的 s o c k e t 通信机制。关键词:s o c k e t;UDP;T CP;客户/服务器;进程;J a v aLinux 环境下基于UDP 的 socket编程浅析吴佩贤绍兴文理学院计算机系浙江3
7、 1 2 0 0 0图1 套接字642 0 0 6.1应 用 安 全通过套接字直接从应用程序进程得到消息,附上源和目标端口号,并把得到的数据段传递给网络层。网络层将数据封装到 I P数据包里,并使用尽力服务方式将数据包传递给接收端。如果该数据包到达接收端,U D P通过端口号和I P目标地址将数据包中的内容传正确地送给接收端的套接字。U D P在传递数据时并不保持发送端和接收端间的连接状态,即不对接收和发送缓冲区、拥塞控制、数据到达顺序等参数进行跟踪,因而 UDP传送的数据包可能出错甚至丢失,其可靠性无法得到保障。尽管如此,U D P在D N S解析、I P电话、实时视频会议、可存储的音频视频
8、流等应用程序中仍大受欢迎,其原因在于:(1)相对于 TCP,面向无连接的数据传送不带时间延迟,速度自然要快。(2)UDP不对发送端和接收端间的诸多参数进行跟踪,使得它有能力支持更多的处于活动状态的客户,灵活性强。(3)在数据段结构对比中可以发现,UDP的数据包头部开销比 T CP小得多。(4)由于没有拥塞控制机制,UDP发送数据的速度仅仅受限于应用程序产生数据的速度、源端的性能(CPU、时钟速度等)以及物理设备可以达到的带宽。3 L i n u x 平台下的 s o c k e t 编程原理在L i n u x 中,s o c k e t 属于文件系统的一部分,网络通信可以被看作是对文件的读取
9、。L i n u x 的许多特性都非常有助于网络编程:首先,L i n u x 拥有P OS I X标准库函数,s o c k e t()、b i n d()、s e n d t o()、r e c v f r o m()等库函数可以方便地实现客户/服务器模型中数据的传送与接收。其次,L i n u x 的进程管理策略也非常适合服务器的工作环境,L i n u x 中的每个进程都对应一个父进程,同时它也能创建多个子进程。发送端的进程可创建多个子进程分别将各自的数据包发往接收端。第三,L i n u x 传承了 UNI X设备无关性这一优秀特性,即通过文件描述符实现了统一的设备接口:磁盘、显示终
10、端、音频设备、打印设备甚至网络通信都使用统一的I/O调用。这些特性大大方便和简化了L i n u x 环境下的网络程序设计。3.1 s o c k e t 函数s o c k e t()用来创建套接口描述符,其格式声明为:i n t s o c k e t(i n t d o ma i n,i n t t y p e,i n t p r o t o c o l)。参数d o ma i n说明网络程序所在的主机采用的通信协议,如AF _ I NET(I P v 4协议)、AF _ I NET6(I P v 6协议)、AF _ L OCAL(Un i x 域协议);参数 t y p e 指定套接口
11、类型(数据流套接口、数据报套接口、原始套接口),即相当于指明了网络程序所采用的通信协议(T CP还是 UDP);参数 p r o t o c o l 由于指定了 t y p e,一般取 0 即可。3.2 b i n d函数b i n d()用来将套接口绑定到本地计算机的某一端口,其格式声明为:i n t b i n d(i n t s o c k f d,s t r u c t s o c k a d d r *my _ a d d r,i n ta d d r l e n)。s o c k f d为套接口描述字;指针 my _ a d d r 指向s o c k a d d r 结构,该结构
12、包含了远程服务程序的I P地址与端口号;a d d r l e n指明 s o c k a d d r 结构的长度。3.3 s e n d t o函数s e n d t o()用于将应用缓冲区中的数据发送到指定的接收进程的地址空间,其格式声明为:i n t s e n d t o(i n t s o c k f d,c o n s t v o i d *ms g,i n t l e n,u n s i g n e d i n tf l a g s,c o n s t s t r u c t s o c k a d d r *t o,i n t t o l e n)。参数s o c k f d用
13、于指定 UDP套接字描述符;ms g 是需要发送的数据缓冲区;t o 是指向包含目的I P 地址和端口号的数据结构s o c k a d d r 的指针;t o l e n是地址的长度。若s e n d t o 发送数据成功,则返回发送数据量的长度,否则返回-1。3.4 r e c v f r o m函数r e c v f r o m()用于将套接字缓冲区中的数据接收并发给用户进程。其格式声明为:i n t r e c v f r o m(i n t s o c k f d,v o i d *b u f,i n t l e n,u n s i g n e d i n t f l a g s,s
14、 t r u c t s o c k a d d r *f r o m,i n t*a d d r l e n)。参数 s o c k f d指明要读取的套接字;b u f 指明应用层的接收缓冲区;l e n表示前面所示缓冲区的大小;f r o m和a d d r l e n则用于指定源地址和源端口号。本文主要阐述的是无连接数据报通信的 s o c k e t 编程过程。客户/服务器主要编写客户程序和服务器程序,以下是主要的编程框架(图 2)。图2 U D P客户机/服务器程序的工作流程无连接的数据报通信中,程序基本的编写步骤如图 2 所示。U D P通信的基本过程如下:在服务器端,先使用 A
15、 F-I N E T协议族创建U D P数据报类型套接字,然后调用b i n d()给此套接字绑定一个端口。由于并不需要建立连接,因此服务器端可以通过调用r e c v f r o m()在指定的端口等待客户端发送来的 U D P数据报。而在客户端,先通过 s o c k e t()创建一个数据报套接字,然后由操作系统为该套接字分配端口号。此后客户端就可以使用s e n d t o()向一个指定的地址发送一个UDP套接字。在服务器端接收到套接字后,从 r e c v f r o m()中返回,在对数据报进行处理后,再用s e n d t o()将处理的结果返回给客户端。使用r e c v f
16、r o m()、s e n d t o()等函数实现通652 0 0 6.1应 用 安 全信时每次均需指定对端地址信息;也可以使用c o n n e c t()来填写两端套接字的有关信息,然后直接使用r e c v()、s e n d()进行通信。这样做的好处是,在随后通信程序中不必每次指定地址信息。套接口读写完毕后,通过 c l o s e()调用关闭连接的套接口文件描述符。不论何种编程语言,和 s o c k e t 打交道都是这一组调用,只是在格式上有所区别。Vi s u a lB a s i c 采用Wi n s o c k 控件,C+B u i l d e r 采用T c l i e
17、 n t S o c k e t 和T s e r v e r S o c k e t 元件,Vi s u a l C+采用 MF C类中的C A s y n c S o c k e t 类和 C S o c k e t 类,J A V A中通过 J a v a.n e t.S o c k e t 和J a v a.n e t.S e r v e r S o c k e t 类库来实现网络之间通信。4 用 J a v a 编写的客户/服务器应用程序示例网络应用程序的核心由一对程序组成,一个客户程序和一个服务器程序。当这两个程序执行的时候,系统就会创建一个客户端进程和一个服务器端进程,并且这两个
18、进程通过对s o c k e t 的读写来互相通信。下面就客户/服务器模型来对U D P的 s o c k e t 编程进行示范,程序功能如下:客户端从其键盘读入一行并将该行发送到通往服务器的套接字上;服务器从其套接字读入一行并将该行转换成大写;服务器将改写后的这一行输出到通往客户端的套接字上;客户端从它的套接字中读出修改后的行,并将该行在显示器上打印输出。4.1 应用程序的客户端代码i mp o r t j a v a.i o.*;i mp o r t j a v a.n e t.*;c l a s s U D P C l i e n tp u b l i c s t a t i c v o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 环境 基于 UDP socket 编程 浅析
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内