`
Gavin.Chen
  • 浏览: 325775 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

[转载] 嵌入式HTTP服务器设计方法

 
阅读更多

嵌入式HTTP服务器设计方法

为了实现设计目标,嵌入式 HTTP 服务器一般应采用功能较强的能用PC、工业PC、或高档MPU作为硬件平台,嵌入式实时操作系统作为软件平台进行平发。硬件平台应具备以太网口和一个或多 个通信模块,比如RS232、RS485、CAN通信卡等。嵌入式实时操作系统实现了TCP/IP等网络协议,并提供实时任务、进程管理、内存管理、文件 系统、API等功能。深圳龙人嵌入式提供全套的嵌入式HTTP服务器设计方案。

 

一、工作流程


    嵌入式HTTP服务器程序开始运行时,主进程首先创建一个接口,并和主机地址绑定到一起,随后置为被动监听状态,等待客户端连接请求的到来。分别用函数 SOCKET()创建一个接口,bind()绑定地址,listen()监听,accept()接收来完成。当建立一个TCP连接后,函数 accept()返回一个新的套接口描述符,主进程就创建一个新的子线程(轻质进程)处理这个新的连接。


    子线程用于处理每具体的HTTP请求。子线程首先解析用户的HTTP请求。当用户请求一个网页时,子线程查找文件系统。如果该网页文件存在,且通过权限认 证,就把它从CF卡读入内存并扫描,发现有自定义标记则调用相应函数进行处理,最后把结果返回给浏览器;否则给一个简单的出错消息。当用户是上传数据时, 子线程调用相应函数读取数据进行处理,并返回处理结果给浏览器。


二、代码设计


    在嵌入式HTTP服务器的代码设计中,考虑到代码的移植性和扩展性,利用C语言实现了面向对象风格的代码结构。代码主要由两上数据结构 request_inf和response_inf以及其上一组操作函数组成。结构request_inf和response_inf分别用来保存 HTTP请求报文和响应报文的所有信息。在结构定义时,应根据具体应用特点设计结构包含的成分。嵌入式HTTP服务器的函数包括通用函数、CGI函数和自 定义标记处理函数等,其中通用函数是一些与HTTP1.1协议有关的函数。


三、通用函数


    void prase_request_line(CHAR *,struct *request_inf)该函数用来解析HTTP请求报文的请求行(Request_Line),并把相应信息存放在结构request_inf中。其 中,对请求行中URI部分的解析包括两种情况。如果用户请求一个网页,则获取文件路径、文件类型;如果用户要求上传数据,则把数据放在一个字符数组中。然 后将文件路径和类型,或者指向该数组的指针、方法、版本号信息都放入结构request_inf中。


    void prease_general_header(CHAR*,struct*request_inf)该函数用来解析HTTP请求报文的调用首部 (General_Header)。之所以把此函数与函数prase_request_line()分开,是考虑到程序的修植性和扩展性。请求行和通用首 部是请求报文中的不同部分,不不同的场合下,要求解析的信息可能存在差导师。同时,这样也能使程序结构更清楚。比如,本项目要从通用首部解析字段 Keep_Alive。该字段指明一个最长的时间或最大请求数目,在此范围内可以保持TCP连接不被释放。


    void prase_request_header(CHAR*,struct*request_inf)
    void prase_entity_header(CHAR*,struct*request_inf)HTTP请求报文的请求头部用来说明浏览器的一些信息,实 体头部则用来说明请求报文中可能存在的实体主体信息。本项目实际上并不需要使用这两个函数来获取相关信息,但考虑到程序的扩展性和移植性,此处仍然把它列 出来,它们是两个空函数。


    send_status_line(int fd,struct *response_inf)此函数用来产生一个HTTP响应报文的状态行(Status_line)。状态行包括三部分内容,即HTTP版本、状态码以 及解释状态码的简单短语。这些信息预先放在结构response_inf中。
    send_general_header(int fd,struct*response_inf)
    send_response_header(int fd,struct*response_inf)
    send_entity_header(int fd,struct*response_inf)


    这三个函数分别用来产生HTTP响应报文的通用首部、响应首部和实体首部。嵌入式HTTP服务器是一个瘦服务器,功能非常简单。因此HTTP响应报文的通 用首部、响应首部和实体首部中的可选字段许多是不需要的,还有许多是固定不变的,例如Last_modified和Content_type字段。 Last_modified字段指出资源上次被修改的时间并由接收方解释。如果接收方已有此资源的拷贝,但此拷贝比Last-Modified域所指定的 要旧,那该拷贝就是过期的。由于网页文件中含有自定义标记,具有实时性,所以此字段根本没有含有Content_type字段指出实体的媒体类型,本项目 中的嵌入式HTTP服务器被设计成只支持HTML类型,因此该字段的内容总是Content_type=text/html。有关服务器和资源的所有标题 域信息都被放入结构response_inf中。


    send_white_line(int fd)此函数用于实体首部和实体之间传送一个空白行。
    void send_entity_body(int fd,CHAR *buff_file)此函数用来传递实体主体,实体主体实际上是一个处理后的网页文件,它被放在指针buff_file指向的缓冲区内。


    void zero_request_inf(struct*request_inf)
    void zero_response_inf(struct*response_inf)这两个函数用于结构request_inf和response_inf清零。
    void get_file(struct*request_inf,struct * response_inf,CHAR*buff_file,void*,void*)该函数用来处理用户HTTL请求。首先,函数会检查 request_inf结构,判断用户是请求一个网页文件还是上传数据。当用户请求网页文件时,函数将根据request_inf结构中的文件路径信息, 在文件系统录找此文件。如果文件不存在或不具备权限,则函数将状态码和解释短语写入结构response_inf,然后直接返回;否则读取文件并调用自定 义标记处理函数,对标记进行处理,处理过的网页文件被放入buff_file指向的缓冲区内,并把状态码、解释短路和与实体有关的一些信息写入结构 response_inf。当用户上传数据时,该函数调用CGI处理函数向CAN总线网络发送帧,然后将状态码和解释短路写入结构 response_inf。利用状态码和解释短语只能用“200,OK”或“500,INTERNAL Server ERROR”等,简单反映执行情况。用户要获取详细信息,可待一段合适的时间后请求网页文件。函数中两个void指针分别指向自定义标记处理函数和CGI 处理函数,或者对应的函数指针数组。


四、自定义标记处理函数和CGI处理函数


    自定义标记处理函数用于对自定义的处理,每一类自定义标记对对应一种自定义标记处理函数,同一类自定义标记的不同数据点利用参数来区分,比如转子秤1的重 量标记可以用weight1来表示。所有的自定义标记处理函数被放在一起,构成一个函数指针数组。自定义标记处理函数向CAN总线网络发送远程帧和接收数 据帧,获取相应的状态信息。CGI总线网络发送远程帧和接收数据帧,获取相应的状态信息。CGI处理函数用变量名来区分,同一类变量对应一种CGI处理函 数。与自定义标记处理函数类似,所有的CGI处理函数也被放在一起,构成一个函数指针数组。

分享到:
评论

相关推荐

    ARM视频介绍

    ARM(Advanced RISC Machines)是一种精简指令集计算(RISC)架构,广泛应用于移动设备、嵌入式系统和服务器等领域。ARM架构因其低功耗特性而受到青睐,在智能手机和平板电脑市场占据了主导地位。ARM架构的核心特点...

    ASP使用Jmail发送邮件的函数及使用方法

    ### ASP使用Jmail发送邮件的函数及使用方法 ...本文将详细介绍如何利用ASP(Active Server Pages)结合Jmail组件来实现邮件发送功能。...本文来源于[qkweb.net](http://www.qkweb.net/showa/659.html),转载请标明出处。

    转载,若依快速开发框架很不错,详情请看https://www.ruoyi.vip/

    它预配置了许多常见的设置,如嵌入式Tomcat服务器、自动配置的Spring beans等,让开发者可以快速启动项目。 3. **MyBatis**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免...

    Qt教程及软件(超级浅显易懂,非常适合初学者)

    Qt Creator还支持QML(Qt Modeling Language),这是一种用于设计动态的、用户友好的界面的语言,特别适合移动和嵌入式设备上的应用程序开发。QML使得设计师和开发人员可以更好地合作,因为QML使得设计界面的工作...

    Power9芯片介绍

    在Hot Chips会议上首次提到的IBM Power 9 处理器有可能成为劲爆芯片,Power 9预计有助新 OEM 和加速器合作伙伴的发展,并可为大蓝色IBM叫板主要竞争对手英特尔的高端服务器注上一剂强心剂。 该款14nm Power 9今年3...

    转载 - 26本 Ruby/Rails 相关英文图书简评

    3. **Ruby on Rails 框架**:Rails 的核心概念包括 MVC(模型-视图-控制器)架构、路由、数据库交互(ActiveRecord)、测试驱动开发(TDD)以及 RESTful API 设计。熟悉这些概念有助于构建高效、可维护的 Web 应用。...

    如何学习Java(转载某位经过锤炼而成为高手的同行)

    - **Servlets**:服务器端的小程序,用于处理HTTP请求并生成响应。Servlets在控制流程跳转方面表现优秀,使程序结构更为清晰。 - **JavaBeans**:用于封装数据与逻辑,提高代码的可读性和可重用性。学会使用...

    Qt教程及软件(超级浅显易懂,非常适合初学者)

    它广泛应用于软件开发领域,特别是桌面应用程序和嵌入式设备。 在描述中,提到了Qt的易学易用性,这表明对于初学者来说,Qt是一个友好的学习对象。文档由个人或团队“蛋蛋整理”贡献,这可能意味着它是来自个人项目...

    Qt Creator

    它包含了对HTTP、FTP、UDP、TCP等网络协议的编程支持,使得开发者可以较为容易地创建客户端和服务器端应用程序。 在最新版本的Qt Creator中,还支持了Qt Quick技术,允许开发者使用QML语言开发跨平台的应用程序。...

    顺舟WIF 模块用户使用手册

    **顺舟WIFI模块**是一款专为实现串口数据与IP数据之间转换而设计的无线终端设备。它采用工业级别的嵌入式处理器,并内置TCP/IP协议栈,能够提供稳定可靠的无线数据传输服务。 #### 二、技术特性 1. **无线通信标准...

    Qt教程及软件超级浅显易懂_非常适合初学者.pdf

    Qt不仅可以用来开发具有图形用户界面(GUI)的程序,还可以用来开发不依赖于GUI的程序,例如控制台工具和服务器应用。 Qt的核心是一套C++库,它提供了丰富的模块和功能,包括但不限于图形界面组件、网络通信、...

Global site tag (gtag.js) - Google Analytics