APP下载

MIF多接口终端多流并发下载的实现

2012-09-19张志飞凌志浩祁学文

自动化仪表 2012年11期
关键词:线程报文信道

张志飞 凌志浩,2 祁学文

(华东理工大学信息科学与工程学院1,上海 200237;化工过程先进控制和优化技术教育部重点实验室2,上海 200237)

0 引言

随着泛在网、物联网技术的高速发展,人们对终端并发访问Web服务器的需求也与日俱增[1]。由于最初设计的网络接口卡成本较高等原因,很多终端只具备一个网络接口卡。因此,只能通过单一接口和单一信道进行访问和资源下载。多线程编程技术使得终端可以并发下载不同资源,这在一定程度上提高了下载 Web服务器上资源的效率[2]。例如Linux或Windows操作系统可以建立多线程,实现对不同网络资源的并发下载。但它们都是基于单一信道的,单一信道由于受到带宽限制,对提高下载资源的效率贡献有限。

无线网络的不断扩展极大地丰富了智能终端的接入方式,如蓝牙、WiFi、GPRS、3G/4G 等。目前,智能终端都装配有多块无线网络接口卡,以提供多种可供选择的无线接入方式,保证了用户的体验[3]。

本文采用的ARM11开发平台扩展了Ethernet接口卡和 WiFi接口卡[4]。而这种具备 Ethernet接口、WiFi接口或者其他接口的多接口(multi-interface,MIF)终端,其各接口之间的通信与协作给多流并发传输模型设计和开发带来了新的挑战。如何并发利用信道容量拓展实现带宽聚合成为了理论研究和实际工程应用的关注焦点[5]。

本文针对MIF终端,应用HTTP协议,通过Socket套接字技术,将不同接口与不同地址进行绑定;并应用多线程编程技术,设计多线程工作模式,实现多信道多流并发下载。

1 超文本传输HTTP协议

1.1 HTTP 概述

超文本传输HTTP协议是面向事务的应用层协议,它是可靠交换网络文件(包括文档、图片、歌曲等各种文件)的重要基础。当用户浏览网页、从网站下载文件资源时,浏览器和Web服务器之间就会通过HTTP协议在 Internet上进行数据的发送和接收[6]。基于请求/响应模式的HTTP协议,凭借其简捷、快速、灵活和高效等特点,应用于各种分布式和合作式超媒体信息系统,并可支持多种应用功能的开发[7]。

1.2 HTTP 报文结构

HTTP报文分为请求报文和响应报文两种。

①请求报文:从终端向服务器发送的报文。

②响应报文:从服务器到终端的响应报文。

请求报文和响应报文的结构如图1所示。

图1 请求报文和响应报文结构Fig.1 Structure of the request and response messages

HTTP的请求报文和响应报文均由请求行、首部行和实体主体三个部分组成。

①开始行:主要用于区别请求报文和响应报文;

②首部行:用来说明浏览器、服务器或报文主体的一些信息;

③实体主体:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。

1.3 HTTP 工作过程

终端访问Web服务器的过程如图2所示。

图2 终端访问Web服务器过程图Fig.2 The accessing procedures from terminal to Web server

访问网络上的网点要使用HTTP协议。本文使用URL对Web服务器进行访问,URL的一般形式如下。

http://<主机>:<端口>/<路径>

当终端需要从服务器下载资源时,其工作过程描述如下。

①终端向Web服务器发出建立连接请求,服务器监听到连接请求后,作出响应,建立TCP连接;

②终端向Web服务器发出下载某个文件资源的请求,即发出HTTP请求报文;

③服务器对接收到的报文请求给予响应,即发出HTTP响应报文,并向终端传输资源;

④释放TCP连接。

2 Socket原理及多线程技术

2.1 Socket概述

Socket是TCP/IP网络编程的通用接口,客户服务器模型是最基本的Socket通信模型,即由客户端向服务器端发出请求,服务器端执行被请求的任务并将响应结果返回客户端。客户端与服务器端交互的过程如图3所示。

图3 Socket通信流程图Fig.3 Flowchart of Socket communication

目前,Socket套接字主要有两种,即基于TCP协议的流式套接字和基于UDP协议的数据报套接字。TCP协议[8]提供了双向、有序、无重复的数据流服务。通过流量控制、拥塞控制和差错重传等机制,TCP能保证数据的无差错、无丢失、按次序送达。UDP协议[9]是无连接的传输协议,发送数据之前无需进行连接;UDP没有拥塞控制,只能尽最大努力交付数据报,但不保证数据可靠、有序、无重复的传输。

2.2 基本套接字函数

由于TCP是基于客户端-服务器(CS)结构,所以在终端和服务器的Socket通信不尽相同,除了基本的建立、绑定、读、写、关闭操作外,在客户端还需要调用连接函数,在服务器端需要调用监听和接受连接请求函数。套接字操作的函数包括以下八种函数。

① socket()函数

int socket(int family,int type,int protocol);建立套接字函数指定了协议族、套接字类型和协议类型。

② bind()函数

int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen);地址绑定函数为套接字实现地址的绑定。

③ listen()函数

int listen(int sockfd,int backlog);监听函数用于指定请求队列长度及监听连接。

④ accept()函数

int accept(int sockfd,const struct sockaddr*cliaddr,socklen_t addrlen);接受连接请求函数在连接请求到来时返回对端地址。

⑤ read()函数

ssize_t read(int sockfd,const void*buf,size_t nbytes);读取函数将数据从套接字读取到系统。

⑥ write()函数

ssize_t write(int sockfd,const void*buf,size_t nbytes);写入函数将系统中的数据写入套接字。

⑦ connect()函数

int connect(int sockfd,const struct sockaddr*seraddr,socklen_t addrlen);连接请求函数用于向服务器发出连接请求。

⑧ close()函数

int close(int sockfd);关闭套接字函数用于释放内存空间。

2.3 Socket多线程编程

Socket多线程具有效率高和存储空间可共享两个重要优点。基于多线程的并发服务器更适合于大量线程间通信的情况,更有利于设计功能强大的服务器[10]。在同一个进程中可以包含多个线程,这些线程共享内存空间,线程之间的切换所带来的开销很小,可以节省大量的CPU时间,从而提高CPU处理效率。本文采用多线程技术,使得与多接口绑定的多信道并发工作;终端通过不同接口绑定的信道访问Web服务器的资源,并对资源进行下载。本文用到的多线程编程函数如下。

① pthread_create()函数

int pthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);其中,thread参数为线程标志符;attr参数为线程属性设置;start_routine参数为线程函数起始地址;arg参数为传递给start_routine的参数。

② pthread_join()函数

int pthread_join(pthread_t*th,void**thread_return);其中,th参数为等待线程的标志符;thread_return参数为用户定义指针,用来存储被等待线程的返回值。

③ ptread_exit()函数

int ptread_exit(void*retval);其中,retval参数为ptread_exit调用者线程的返回值,可由其他函数和pthread_join来检查获取。

3 多流并发下载的实现

3.1 硬件实现

在终端控制机制中,泛在网、物联网经常需要终端并发访问不同Web服务器,并对Web服务器上的资源文件进行并发下载。传统的HTTP下载都是基于单信道的,而随着MIF终端的不断普及,它为开发多信道并发下载提供了硬件上的支持。本文设计的终端具备Ethernet和 WiFi两个接口(如 ARM11开发平台),Ethernet接口通过网线连接到路由器,WiFi接口通过WiFi网卡接入路由器,路由器可以访问Internet网络。假设需要下载的资源文件分别存放在服务器A(IP:123.125.115.160)和服务器 B(IP:101.4.60.74),并通过软件编程并发地从服务器A上下载zip文件,从服务器B上下载mp3文件。

3.2 软件设计

通过软件编程,终端建立线程1,将Ethernet接口与服务器A的信道绑定,访问服务器A,并下载服务器A上的zip文件;终端建立线程2,将WiFi接口与服务器B的信道绑定,访问服务器B,并下载服务器B上的mp3文件。软件流程具体实现过程如下。

①在主函数main()函数中调用thread_create()函数,创建线程;

②thread_create()函数主体中调用pthread_create()函数,通过 pthread_create(&thread[0],NULL,thread1,NULL) 和 pthread_create(&thread[0],NULL,thread2,NULL)创建两个线程thread1和thread2;

③ 在线程1函数thread1()中,访问服务器A,下载服务器A上的zip文件;

④ 在线程2函数thread2()中,访问服务器B,下载服务器B上的mp3文件;

⑤调用thread_wait()函数,在函数主体中调用pthread_join(thread[0],NULL)和 pthread_join(thread[1],NULL),等待两个线程结束;

⑥两个线程结束后,退出主函数。

访问服务器和下载过程可以具体描述为如下几个步骤。

①建立Ethernet/WiFi接口套接字,并初始化;

②将Ethernet/WiFi接口地址与套接字通过bind()函数绑定;

③调用connect()函数,Ethernet/WiFi接口套接字向服务器A/B的套接字发出连接请求;

④服务器A/B对该请求作出响应,向终端传输其所请求的资源;

⑤终端通过Ethernet/WiFi接口,接收来自服务器A/B的资源文件;

⑥接收完成后,关闭套接字。

软件流程如图4所示。

图4 软件流程图Fig.4 Flowchart of software

3.3 运行结果

调试程序无误后,按如下步骤运行。

①在超级终端输入命令gcc httpload.c-o httploadlpthread,编译 httpload.c;

② 在超级终端输入./httpload,运行httpload。

由运行结果可知,终端通过Ethernet接口和WiFi接口并发访问Web服务器。Ethernet接口绑定的是到服务器A的信道,并对服务器 A上的资源ludashisetup.zip发出HTTP下载请求。WiFi接口绑定的是到服务器 B的信道,并对服务器B上的资源5968339.mp3发出HTTP下载请求。两者通过开启两个线程并发工作。终端通过Ethernet接口和WiFi接口并发接收来自服务器A和服务器B的资源文件,资源完成下载后给出完成信息。信息包括了下载的资源名以及资源所在服务器的IP地址。从而进一步提高网络资源的利用率。

ARM11应用开发平台搭载的Linux操作系统测试表明,MIF多接口终端能有效实现多路并发访问Web服务器和多流并发下载功能,具有可移植性强的特性和较高的应用价值。

4 结束语

本文通过综合运用Socket套接字技术、多线程编程技术以及HTTP协议,实现了支持HTTP多信道多流并发下载的MIF多接口终端的设计,满足了泛在网、物联网对终端快速访问的技术需求。借助多接口终端能充分利用不同网络信道实现多流并发下载的优势,

[1]朱洪波,杨龙祥,朱琦.物联网技术进展与应用[J].南京邮电大学学报:自然科学版,2011,31(1):1 -9.

[2]周学威,闫鑫,赵榉云,等.基于SOCKET的多线程下载工具的开发[J].电子测试,2011(8):104 -106.

[3]张平,苗杰,胡铮,等.泛在网络研究综述[J].北京邮电大学学报:自然科学版,2010,35(5):1 -6.

[4]董玉明.基于ARM11的移动互联设备硬件设计与实现[D].西安:西安电子科技大学,2010.

[5]吴晓丹.CMT中流与路径映射机制的研究[J].福建电脑,2010,26(2):77 -78.

[6]李晶媛,韩慧莲.基于HTTP协议的多线程下载工具的实现[J].电脑开发与应用,2009,22(10):52 -54.

[7]徐塞虹.路由器中基于HTTP协议的应用开发[D].北京:北京邮电大学,2008.

[8]Postel J.RFC793 Transmission Control Protocol[S].1981.

[9]Postel J.RFC768 User Datagram Protocol[S].1980.

[10]周丽,焦程波,兰巨.LINUX系统下多线程与多进程性能分析[J].微计算机信息,2005,21(9):118 -120.

猜你喜欢

线程报文信道
基于J1939 协议多包报文的时序研究及应用
信号/数据处理数字信道接收机中同时双信道选择与处理方法
基于C#线程实验探究
低轨星座短报文通信中的扩频信号二维快捕优化与实现
CTCS-2级报文数据管理需求分析和实现
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
浅析反驳类报文要点
一种无人机数据链信道选择和功率控制方法
基于导频的OFDM信道估计技术