http://sourceforge.net/projects/boahttpd/
一个C接口的开发库,适用于 windows/linux/或其他嵌入式平台,支持CGI扩展,支持多线程。采用面向对象开发,一个应用里可以同时开多个http server,只要端口不同就互不影响。主要应用场景应该是嵌入式应用(所谓boa-server的概念),在需要做一个基本web的设备管理使用。在例子中就是展示,从页面信息的提交、到处理、到结果的返回,里面结合jquery/bootstrap网页技术,可以作出一个精致的设备管理控制页面。
- Web file downloading 网页文件浏览
- CGI support , CGI支持
- Multi-thread, Multi-instance 多线程、多实例
- Cross-Platform (Windows, Linux, other Embedded Linux) 跨平台支持
- Filter & Authentication support 过滤器 / 鉴权密码认证
- Cookie support , Cookie支持
这个开发库体积较小,已经编译好了windows, linux(fedora14,x86)版本的库。使用起来就是一个头文件、一个库文件。比如说下面几句话就完成了一个简单的http服务器:
#include "../boahttpd.h"
int main()
{
boa_server_t server;
if(boa_server_create(&server, NULL,
"wwwroot",
8888, "0.0.0.0") < 0)
{
printf("failed to create server!\n");
return 0;
}
getchar();
boa_server_destroy(&server);
return 0;
}
其实就是一个简单的create操作,传入主目录文件夹的位置,端口号就可以了。在当前目录下创建一个wwwroot, 在wwwroot放一个index.html,运行程序试试吧。在浏览器里输入http://127.0.0.1:8888试着访问一下。
上面是完成一个普通的http服务器,可以浏览下载网页了。但是若要支持cgi的处理,则需要注册一些回调函数。每个cgi服务有一个唯一的名称,并对应一个回调函数。当然,可以用一个回调函数来处理所有的cgi服务。示范代码如下:
static int cgi_handler(void* context, void* userdata)
{
… handle the cgi request …
return 0;
}
int main()
{
boa_cgi_t cgi ;
boa_cgi_create(&cgi);
boa_cgi_register(&cgi, "test", &cgi_handler, NULL);
boa_server_t server;
if(boa_server_create(&server,&cgi,
wwwroot", 8888, "0.0.0.0") < 0)
{
printf("failed to create server!\n");
return 0;
}
getchar();
boa_cgi_destroy(&cgi);
boa_server_destroy(&server);
return 0;
}
上面是先定义若干个handler(即callback),然后把这些handler都添加一个boa_cgi_t对象里,然后把这个boa_cgi_t对象交给server即可。在运行的时候,server在接收到cgi请求后,会根据cgi服务的名称、找到相应的handler来处理。
比如,输入cgi请求: http://127.0.0.1:8888/cgi/test?name=someone
server收到此cgi请求后,检查到服务名称为test,于是检查boa_cgi_t里有没有注册了名称为"test"的handler,如果有的话就调用之。在handler里,可以获取cgi请求的相关信息,例如参数"name=someone"、以及HTTP头部的其他field字段。如果是个POST请求,可以获得正文。
static int cgi_handler(void* context, void* userdata)
{
const char* service = boa_cgi_name(context);
const char* method = boa_cgi_method(context);
const char* argument = boa_cgi_args(context);
const char* content = boa_cgi_content(context);
const char* anyfield = boa_cgi_field(context,”Content-Length”);
int sock = boa_cgi_socket(context);
}