欢迎来到天天文库
浏览记录
ID:9008599
大小:457.50 KB
页数:5页
时间:2018-04-14
《基于linux的socket网络编程的性能优化》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、基于Linux的Socket网络编程的性能优化时间:2009-10-2009:53:33来源:国外电子元器件作者:王雷,王子淘太原理工大学1引言 随着Intenet的日益发展和普及,网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用Linux操作系统。Linux是一个源代码公开的免费操作系统,具有强移植性,所以对基于Linux的Socket网络编程的研究越来越重要。 Socket实际是网络传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程问的逻辑通道,而应用层的进程则利用传输层向另一台主机的某一进程通信。Socke
2、t就是应用层与传输层之间的桥梁。如图2所示。 使用Socket编程时可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过Internet在全球范围内进行通信。编写并运行Socket的客户端和服务器端程序,双方通过套接字建立了服务连接请求,并且通过一些方法提高Socket的性能。3Socket编程3.1Socket类型 常见的Socket有3种类型: (1)流式Socket(SOCK_STREAM)它提供可靠的通信流,使用面向连接的TCP协议,从而保证数据传输的正确性和顺序性: (2)数据报Socket(SOC
3、K_DGRAM)数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它定义一种面向无连接的服务,使用数据报协议UDP; (3)原始Socket(SOCK_RAM)它允许直接访问底层协议,功能强大但使用较为不便,主要用于一些协议的开发。本编写的Socket属于流式Socket。3.2Socket编程流程 Socket编程采用客户/服务器模式。因此编程分为服务器端和客户端两部分。 每一个Socket都用一个半相关描述(协议,本地地址,本地端口)来表示,Socket也有一个类似于文件打开的函数,该函数返回一个整型的Socke
4、t描述符,随后建立连接,数据传输等操作都通过Socket来实现。 编程流程如下:服务器端首先建立Socket,返回该Socket的描述符:配置Socket的端口和IP地址;建立监听甬数,检测是否有客户端向服务器发送请求,若有则接收该请求,将其放到接收队列中:从接收队列中接受一个请求;并向客户端发送确认连接信息。 客户端建立一个Socket,返回该Socket的描述符;配置Socket端口和IP地址;向服务器发送连接请求,并接收服务器发回的确认连接信息。双方通信结束后,关闭其Socket。进行Socket编程的基本函数有socket(),
5、bind(),listen(),accept(),connect(),send(),recv(),close()。图3为Socket的编程流程图。3.3程序的编译和运行结果 (1)在Linux的VI编辑器下编写服务器端程序serv.c和客户端程序clt.c。运用交叉编译工具arm-linux-gcc,执行编译指令生成可执行文件。 其指令为: #gccserv.c=0serv #gccclt.c-0clt 编译没有错误则会生成可执行文件serv和clt。 (2)配置服务器和客户端的IP,保证网络畅通,在serv.c中已将服
6、务器的IP设置为:192.168.2.111。在客户端的“网络设置”中设置IP为:192.168.2.22,可以通过ping命令检测网络是否畅通。 (3)在一台计算机的终端先运行服务器程序(./serv),再在客户端的计算机终端上运行客户端程序(./clt192.:168.2.1l1)就会看到结果(Hello,WangLei!Youareconnected!);运行结果如图4和图5所示。如果未运行服务器程序而先运行客户端程序将立即提示“Connect:Connectionrefused”。4SOCket的性能优化4.1解决多路复用 上面
7、的运行过程仅实现了一个客户端接人,在实际情况中,人们往往遇到多个客户端连接服务器端的情况。由于connect(),recv(),send()都是阻塞性函数,若资源没有准备好,则调用该甬数的进程将进入睡眠状态,无法处理I/O多路复用。在服务器端的serv.c中加入select()函数,它可同时监听多个套接字,实现I/O的多路复用。 其函数原型如下: 该函数监视一系列文件描述符,特别是readfds、writefds和exceptfds。如果想知道是否能从标准输入和套接字描述符sockfd读入数据,只要将文件描述符“0”和“sockfd
8、”加入集合readfds中。参数numfds应等于最高文件描述符的值加1,设置该值为sockfd+1。因为它一定大于标准输入的文件描述符“0”。当函数
此文档下载收益归作者所有