嵌入式Web 服务器Boa 的移植及其应用
发布时间:2008/5/27 0:00:00 访问次数:494
随着嵌入式技术的发展和高速宽带网络的普及, 利用网络实现远程监控已为人们广泛接受, 嵌入式网络监控技术正是在此条件下逐步发展成熟起来的. 用户使用web 浏览器, 通过以太网远程访问内置web 服务器的监控摄像机, 不但可以实现对现场的远程视频监控, 而且可以向监控现场发送指令. 在整个系统的实现过程中, 嵌入式web 服务器起着十分重要的作用, 因此, 在嵌入式网络视频监控系统中,web 服务器的设计对监控系统的整体性能具有直接的影响, 只有有了高效率的web 服务器, 监控系统的性能才能得到充分的发挥.
1 嵌入式web 服务器boa 的特点
boa 是一款单任务的http 服务器, 与其他传统的web 服务器不同的是当有连接请求到来时, 它并不为每个连接单独创建进程, 也不通过复制自身进程来处理多链接, 而是通过建立http 请求列表来处理多路http 连接请求, 同时它只为cgi 程序创建新的进程, 这样就在最大程度上节省了系统资源, 这对嵌入式系统来说至关重要. 同时它还具有自动生成目录、自动解压文件等功能, 因此, boa 具有很高的http 请求处理速度和效率, 在嵌入式系统中具有很高的应用价值.
2 boa 的功能实现
嵌入式web 服务器boa 和普通web 服务器一样, 能够完成接收客户端请求、分析请求、响应请求、向客
户端返回请求结果等任务. 它的工作过程主要包括:
( a) 完成web 服务器的初始化工作, 如创建环境变量、创建tcp 套接字、绑定端口、开始侦听、进入循环结构, 以及等待接收客户浏览器的连接请求;
( b) 当有客户端连接请求时,web 服务器负责接收客户端请求, 并保存相关请求信息;
( c) 在接收到客户端的连接请求之后,分析客户端请求, 解析出请求的方法、url 目标、可选的查询信息及表单信息, 同时根据请求做出相应的处理;
( d)web 服务器完成相应处理后, 向客户端浏览器发送响应信息, 关闭与客户机的tcp 连接.
嵌入式web 服务器boa 根据请求方法的不同, 做出不同的响应. 如果请求方法为head, 则直接向浏览器返回响应首部; 如果请求方法为get, 则在返回响应首部的同时, 将客户端请求的url 目标文件从服务器上读出, 并且发送给客户端浏览器; 如果请求方法为post, 则将客户发送过来的表单信息传送给相应的cgi 程序, 作为cgi 的参数来执行cgi 程序, 并将执行结果发送给客户端浏览器. boa 的功能实现也是通过建立连接、绑定端口、进行侦听、请求处理等来实现的. 其初始化部分的源代码如下:
int server_s;
server_s = socket( server_pf,sock_stream,ipproto_tcp) ;
if( server_s == - 1) {
die( unable to create socket) ;
}
if( set_nonblock_fd( server_s) == - 1) {
die( unable to set server socket to nonblocking) ;
}
if( fcntl( server_s,f_setfd,1) == - 1) {
die( can′t set close! on! exec on server socket! ) ;
}
if( ( setsockopt( server_s, sol_socket,so_reuseaddr,( void*)&sock_opt,
sizeof( sock_opt) ) ) == - 1) {
die( setsockopt) ;
}
if( bind_server( server_s, server_ip, server_port) == - 1) {
die( unable to bind) ;
}
if( listen( server_s, backlog) == - 1) {
die( unable to listen) ;
}
上述代码主要用于打开一个有效的socket 描述符, 然后将其转换为无阻塞套接字. 函数bind( ) 用于建立套接字描述符与指定端口间的关联, 并通过函数listen( ) 在该指定端口侦听, 等待远程连接请求.当侦听到连接请求时, boa 调用函数get_request( int server_sock) 获取请求信息, 通过调用函数accept( ) 为该请求建立一个连接. 在建立连接之后, 接收请求信息, 同时对请求进行分析. 当有cgi 请求时, 为cgi 程序创建进程, 并将结果通过管道发送输出. boa 的整体工作流程如图1 所示.
3 boa 在arm 上的移植
3.1 修改web 服务器boa
为进一步提高系统性能, 应根据嵌入式网络视频监控系统的特点, 对web 服务器作适当的修改. 修改内容主要包括:
( a) 定义常数buffer_size 为8192, 通过增大buffer_size 的值来增加输入输出缓存,以提高图像传输速度, 从而加快系统的响应速度;
( b) 修改请求列表参数, 根据可能出现的请求数量修改服务器可以处理的http 连接数量;
( c) 为适应嵌入式系统资源较少的情况, 精简uclinux 操作系统中的库函数,使用uclibc 进行编译, 因此要使boa 在嵌入式系统上正常运行, 用户必须自己实现一些函数功能, 如字符串查找函数strstr( ) 和字符串复制函数strdup( ) 等.
3.2 交叉编译boa
随着嵌入式技术的发展和高速宽带网络的普及, 利用网络实现远程监控已为人们广泛接受, 嵌入式网络监控技术正是在此条件下逐步发展成熟起来的. 用户使用web 浏览器, 通过以太网远程访问内置web 服务器的监控摄像机, 不但可以实现对现场的远程视频监控, 而且可以向监控现场发送指令. 在整个系统的实现过程中, 嵌入式web 服务器起着十分重要的作用, 因此, 在嵌入式网络视频监控系统中,web 服务器的设计对监控系统的整体性能具有直接的影响, 只有有了高效率的web 服务器, 监控系统的性能才能得到充分的发挥.
1 嵌入式web 服务器boa 的特点
boa 是一款单任务的http 服务器, 与其他传统的web 服务器不同的是当有连接请求到来时, 它并不为每个连接单独创建进程, 也不通过复制自身进程来处理多链接, 而是通过建立http 请求列表来处理多路http 连接请求, 同时它只为cgi 程序创建新的进程, 这样就在最大程度上节省了系统资源, 这对嵌入式系统来说至关重要. 同时它还具有自动生成目录、自动解压文件等功能, 因此, boa 具有很高的http 请求处理速度和效率, 在嵌入式系统中具有很高的应用价值.
2 boa 的功能实现
嵌入式web 服务器boa 和普通web 服务器一样, 能够完成接收客户端请求、分析请求、响应请求、向客
户端返回请求结果等任务. 它的工作过程主要包括:
( a) 完成web 服务器的初始化工作, 如创建环境变量、创建tcp 套接字、绑定端口、开始侦听、进入循环结构, 以及等待接收客户浏览器的连接请求;
( b) 当有客户端连接请求时,web 服务器负责接收客户端请求, 并保存相关请求信息;
( c) 在接收到客户端的连接请求之后,分析客户端请求, 解析出请求的方法、url 目标、可选的查询信息及表单信息, 同时根据请求做出相应的处理;
( d)web 服务器完成相应处理后, 向客户端浏览器发送响应信息, 关闭与客户机的tcp 连接.
嵌入式web 服务器boa 根据请求方法的不同, 做出不同的响应. 如果请求方法为head, 则直接向浏览器返回响应首部; 如果请求方法为get, 则在返回响应首部的同时, 将客户端请求的url 目标文件从服务器上读出, 并且发送给客户端浏览器; 如果请求方法为post, 则将客户发送过来的表单信息传送给相应的cgi 程序, 作为cgi 的参数来执行cgi 程序, 并将执行结果发送给客户端浏览器. boa 的功能实现也是通过建立连接、绑定端口、进行侦听、请求处理等来实现的. 其初始化部分的源代码如下:
int server_s;
server_s = socket( server_pf,sock_stream,ipproto_tcp) ;
if( server_s == - 1) {
die( unable to create socket) ;
}
if( set_nonblock_fd( server_s) == - 1) {
die( unable to set server socket to nonblocking) ;
}
if( fcntl( server_s,f_setfd,1) == - 1) {
die( can′t set close! on! exec on server socket! ) ;
}
if( ( setsockopt( server_s, sol_socket,so_reuseaddr,( void*)&sock_opt,
sizeof( sock_opt) ) ) == - 1) {
die( setsockopt) ;
}
if( bind_server( server_s, server_ip, server_port) == - 1) {
die( unable to bind) ;
}
if( listen( server_s, backlog) == - 1) {
die( unable to listen) ;
}
上述代码主要用于打开一个有效的socket 描述符, 然后将其转换为无阻塞套接字. 函数bind( ) 用于建立套接字描述符与指定端口间的关联, 并通过函数listen( ) 在该指定端口侦听, 等待远程连接请求.当侦听到连接请求时, boa 调用函数get_request( int server_sock) 获取请求信息, 通过调用函数accept( ) 为该请求建立一个连接. 在建立连接之后, 接收请求信息, 同时对请求进行分析. 当有cgi 请求时, 为cgi 程序创建进程, 并将结果通过管道发送输出. boa 的整体工作流程如图1 所示.
3 boa 在arm 上的移植
3.1 修改web 服务器boa
为进一步提高系统性能, 应根据嵌入式网络视频监控系统的特点, 对web 服务器作适当的修改. 修改内容主要包括:
( a) 定义常数buffer_size 为8192, 通过增大buffer_size 的值来增加输入输出缓存,以提高图像传输速度, 从而加快系统的响应速度;
( b) 修改请求列表参数, 根据可能出现的请求数量修改服务器可以处理的http 连接数量;
( c) 为适应嵌入式系统资源较少的情况, 精简uclinux 操作系统中的库函数,使用uclibc 进行编译, 因此要使boa 在嵌入式系统上正常运行, 用户必须自己实现一些函数功能, 如字符串查找函数strstr( ) 和字符串复制函数strdup( ) 等.
3.2 交叉编译boa
深圳服务热线:13692101218 13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)

深圳市碧威特网络技术有限公司
付款方式