新闻中心

EEPW首页>嵌入式系统>设计应用> 基于ARM-Linux嵌入式系统的多进程并发服务器设计

基于ARM-Linux嵌入式系统的多进程并发服务器设计

作者: 时间:2016-09-12 来源:网络 收藏

摘要:随着、智能电网、智能移动设备的发展,我们将能在任何时候任何地方获取我们所需的信息,本文设计一款基于。它拥有传统服务器的功能,可远程访问和操作,同时又具有体积小、噪声低、低功耗、低成本的优势,非常适合用于智能楼宇的家用服务器。

本文引用地址://m.amcfsurvey.com/article/201609/304671.htm

目前大家所用的大多是X86服务器,其功能完善、运行速度快、软件支持性好等优点,已被人们普遍认同。但其由于价格昂贵、功耗高、噪声大等原因,一般只应用于工厂、企事业单位,但随着互连网的发展,我们需要更多的小型服务器终端,因此,低成本、低功耗的嵌入式服务器将有极大的应用空间。

面向连接的并发服务器是目前Linux网络服务器的主流形式。它采用主、从服务器的工作方式,能较好地解决了网络中客户进程的并发请求问题。目前在嵌入式领域,基于ARM技术的微处理器应用约占据了32位RISC微处理器80%以上的市场份额,同时,ARM处理器和嵌入式Linux的结合也正变得越来越紧密,在工业控制、消费类电子产品、通信系统、无线系统等各类产品市场都可以看到ARM与Linux相结合的身影。因此,本文介绍了一种基于设计。

1 并发服务器原理及框架

1. 1 基本的C/S服务模型

相互通信的网络程序通常可以分为客户端和服务器端两部分。简单的C/S服务模式客户端和服务器采用的是一对一的关系,而实际上一个客户同时可以与多个服务器通信,一个服务器同时也能与多个客户通信。

Linux下使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,如图1所示。

基于ARM-Linux嵌入式系统的多进程并发服务器设计

服务器端与客户端连接的步骤如下:

1)使用socket0函数创建套接字;

2)将创那的套接字绑定到指定的地址结构

3)Listen0函数设置套接字为监听模式,使服务器进入被动打开的状态

4)接受客户端的连接请求,建立连接

5)终止连接

客户端实现步骤:

1)使用socket0函数创建套接字

2)调用connect0函数建立一个TCP服务器的连接

3)发送数据请求,接收服务器的数据应答

4)终止连接

这样就建立了最简单的C/S连接模式,而所有基于TCP套接字的网络服务也都是建立在这个基础上的。

1.2模型

前面介绍了简单的TCP客户端/服务器概念和连接,其中服务器每次只能处理一个客户的请求,它的实现虽然很简单但效率却很低,在实际应用中,这样的服务器是不能满足实际需求的。

在实际应用中为了让一个服务器同时为多个客户服务,处理多个客户的请求,那么就需要用并发服务器。Linux下主要支持的并发服务器有进程、线程。创建线程要比进程快,但一个进程内的所有线程共享相同的内存空间、全局变量等信息,所以当一个线程崩溃时,它会影响同一进程中的其他线程。

Linux系统中可以同时存在多个进程,但相对线程来说,进程是独立的。它拥有独立的地址空间、执行堆栈、文件描述符等,在未经允许的情况下,一个进程不能访问另一个进程的资源,因此一个进程崩溃不会造成其他进程的崩溃。由于考虑远程监控系统要求的安全性和稳定性,本系统设计为多进程并发服务器。图2为并发服务器的基本模型图。

基于ARM-Linux嵌入式系统的多进程并发服务器设计

1.3 多进程服务器原理

在多进程并发服务器中是通过调用fork或vfork函数来创建新进程。当父进程产生新的子进程后,父、子进程共享父进程在调用fork之前的所有描述符。接下来父进程只负责接收客户请求,而子进程只负责处理客户请求。

图3说明父进程调用fork生成子进程后,父、子进程对客户请求和描述符的操作过程。

基于ARM-Linux嵌入式系统的多进程并发服务器设计

1)当服务器调用accept0函数时,连接请求从客户到达服务器时双方状态。

2)当客户的请求被接受后。接下来服务器就会调用fork函数生成子进程。

3)最后父进程关闭已连接描述符,由子进程关闭监听描述符,这样既可以节省系统资源,又可以防止父、子进程同时对共享描述符进程操作。至此子进程处理与客户的连接,父进程可以对监听描述符再次调用accept,继续处理下一个客户的请求。

2 功能代码分析

网络主程序设计其实主要也就是父进程所执行的程序,程序设计的流程图如4所示。

基于ARM-Linux嵌入式系统的多进程并发服务器设计

linux中的网络编程通过socket接口实现。socket既是一种特殊的I/O,它也是一种文件描述符。一个完整的socket包括协议、本地地址、本地端口、远程地址、远程端口;每一个socket有一个本地的唯一socket号,由操作系统自动分配。以下是建立TCP socket,其中AF_INET为IPv4,SOCK_STREAM为TCP协议,如建立失败则返回-1。

listen_fd=socket(AF_INET,SOCK_STREAM,0)

调用bzero初始化套接字地址结构,并对地址结构中的成员赋值,代码如下。

bzero(client_addr,sizeof(struct sockaddr_in));

client_addr.sin_family=AF_INET;

client_addr.sin_port=htons(MY_PORT);

client_addr.sin_addr.s_addr=htonl(INADDR_ANY);

为了给调用socket0函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系,就要用到绑定函数bind0。通过绑定后端口号保证了地址信息的唯一性。如失败返回-1。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭