使用Libmicrohttpd搭建内嵌(本地)服务器的方法
Libmicrohttpd简介 GNU Libmicrohttpd是一个用来在项目中内嵌http服务器的C语言库,它具有以下几个非常鲜明的特点: C语言库,小而快。 API非常简单,且都是可重入的。 兼容HTTP1.1。 支持4种多线程模型(select、poll、pthread、thread poll)。 跨平台。 生成的二制文件只有32K(不包含TLS/SSL等额外功能)。 搭建一个简单的本地静态服务器 这篇文章里,我们只编写一个简单的静态服务器,对于用户的所有请求我们都只返回同一个html页面,该页面显示一串字符。 1. 下载Libmicrohttpd,编译后添加进VS项目 为了使用Libmicrohttpd,我们需要将其添加进VS项目中。这里我们选择编译源代码生成静态库,因为官方给的下载静态库版本链接在使用时会有问题,可能是运行库版本不一致; 并且在使用静态库的情况下,我们只需要引用两个文件就可以了(一个头文件、一个库文件),项目结构不会混乱不清。 实际上Libmicrohttpd的源码编译非常简单,它提供了VS编译文件,基本上我们只需要进入<> 生成的文件包括一个头文件和一个静态库文件,新建一个VS控制台项目,并将它们添加到VS项目中。 2. main函数 main函数非常简单,核心调用只有2个函数:<> int main() { const int port = 8888; struct MHD_Daemon* daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY,port,NULL,connectionHandler,MHD_OPTION_END); if (daemon == NULL) { std::cout << "cannot start server!n"; return -1; } std::cin.get(); MHD_stop_daemon(daemon); return 0; } MHD_start_daemon函数包含非常多的参数,这也意味着它集成了很多的功能,这里我们只关注四个参数,其它都为NULL: MHD_USE_INTERNAL_POLpNG_THREAD。这个参数与其他两个参数(MHD_USE_POLL_INTERNAL_THREAD、MHD_USE_EPOLL_INTERNAL_THREAD)一起构成了microhttpd支持的三种模式:select、poll、epoll。用户必须选择这三种模式之一。具体信息见源码。 port。端口号。 connectHandler。处理请求的函数。 MHD_OPTION_END。由于MHD_start_daemon最后一个参数是一个变参,因此MHD_OPTION_END用来表示变参终止。 MHD_stop_daemon函数比较简单,这里不介绍了。 3 请求处理函数 所有的请求处理都发生在<> int connectionHandler( void *cls,struct MHD_Connection *connection,const char *url,const char *method,const char *version,const char *upload_data,size_t *upload_data_size,void **con_cls) { const char* pageBuffer = "<html><body>Hello,I'm lgxZJ!</body></html>"; struct MHD_Response *response; response = MHD_create_response_from_buffer(strlen(pageBuffer),(void*)pageBuffer,MHD_RESPMEM_PERSISTENT); if (MHD_add_response_header(response,"Content-Type","text/html") == MHD_NO) { std::cout << "MHD_add_response_header errorn"; return MHD_NO; } if (MHD_queue_response(connection,MHD_HTTP_OK,response) == MHD_NO) { std::cout << "MHD_queue_response errorn"; return MHD_NO; } MHD_destroy_response(response); return MHD_YES; } 这个函数签名包含了所有用来处理请求的有用信息,这里不逐一介绍了。microhttpd库提供了函数来方便我们响应请求,这里我们重点看创建响应。microhttpd库提供了两种方法来创建请求:从buffer创建、从文件创建。但是后者需要传入一个文件描述符,这在windows上不是很方便。 我们这里用缓冲创建。需要注意的是最后一个参数,这是一个<> 运行程序,我们打开浏览器并输入<> 还能做更多
请求处理函数还包含请求方法和请求数据。 我们还可以挂起、恢复连接。 以上这篇使用Libmicrohttpd搭建内嵌(本地)服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |