工控网中基于Linux的嵌入式HTTP服务器设计
*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处理函数,或者对应的函数指针数组。
(2)自定义标记处理函数和CGI处理函数
自定义标记处理函数用于对自定义的处理,每一类自定义标记对对应一种自定义标记处理函数,同一类自定义标记的不同数据点利用参数来区分,比如转子秤1的重量标记可以用weight1来表示。所有的自定义标记处理函数被放在一起,构成一个函数指针数组。自定义标记处理函数向CAN总线网络发送远程帧和接收数据帧,获取相应的状态信息。CGI总线网络发送远程帧和接收数据帧,获取相应的状态信息。CGI处理函数用变量名来区分,同一类变量对应一种CGI处理函数。与自定义标记处理函数类似,所有的CGI处理函数也被放在一起,构成一个函数指针数组。由于自定义标记函数和CGI处理函数类型众多,这里就不列举了。
结语
我们设计的嵌入式HTTP服务器具备良好的通用性和可移植性。通过更换或增加PC104通信模块,该服务器能够支持不同的现场总线,或同时连接几种不同的设备级轻质网络。同时在服务器代码设计中,用C语言实现了面向对象风格的代码结构。这样,如果要求服务器端具备更多的特性,只需要简单修改结构request_inf、response_inf、操作函数和网页文件即可达到目的。这种设计思路不仅适用于嵌入式HTTP服务器,随着硬件技术尤其是嵌入式操作系统技术的发展,它同样能够应用到其它嵌入式产品的开发中。