最近工作中需要实现一些审计功能,软件是服务器端程序,对于展示来说,在浏览器上能直接查看可能是最直接最友好的方式了,libevent中提供了http模块,正好我们的软件也依赖这个,所以决定用它来实现一个httpserver,用来展示相关数据。不多说,直接上代码表示这个工作流程

#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/http.h>

bool startHttpServer(const char* ip, int port, void (*cb)(struct evhttp_request *, void *), void *arg)
{
    //创建event_base和evhttp
    event_base* base = event_base_new();
    evhttp* http_server = evhttp_new(base);
    if (!http_server) {
        return false;
    }
    //绑定到指定地址上
    int ret = evhttp_bind_socket(http_server, ip, port & 0xFFFF);
    if (ret != 0) {
        return false;
    }
    //设置事件处理函数
    evhttp_set_gencb(http_server, cb, arg);
    //启动事件循环,当有http请求的时候会调用指定的回调
    event_base_dispatch(base);
    evhttp_free(http_server);
    return true;
}
void MyHttpServerHandler(struct evhttp_request* req, void* arg)
{
    //创建要使用的buffer对象
    evbuffer* buf = evbuffer_new();
    if (!buf) {
        return;
    }
    //获取请求的URI
    const char* uri = (char*)evhttp_request_get_uri(req);
    //添加对应的HTTP代码
    evbuffer_add_printf(buf,"<html>");
    evbuffer_add_printf(buf,"<head><title>MyHttpServer</title></head>");
    evbuffer_add_printf(buf, "<body>");
    //根据URI显示不同的页面
    if (strcmp(uri, "/") == 0) {
        evbuffer_add_printf(buf,"<p>Welcome to my http server</p>");
    } else if (strcmp(uri, "/about") == 0) {
        evbuffer_add_printf(buf,"<p>I love C++</p>");
    }
    evbuffer_add_printf(buf, "</body>");
    evbuffer_add_printf(buf,"</html>");
    //回复给客户端
    evhttp_send_reply(req, HTTP_OK, "OK", buf);
    evbuffer_free(buf);
}
int main(int argc, char** argv)
{
    //Windows 平台套接字库的初始化
#ifdef WIN32
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif
    //启动服务在地址 127.0.0.1:9000 上
    startHttpServer("127.0.0.1", 9000, MyHttpServerHandler, NULL);
#ifdef WIN32
    WSACleanup();
#endif
    return 0;
}

好了,编译运行:

再看看about的页面

一个简单的httpserver就这样实现了,当然这里只是简单描述了这个工作流程,实际项目中还是根据不同的需求来实现不同的页面输出的。

用libevent实现httpserver相关推荐

  1. 开源新生代的成长之路:从校园到开源,需要迈过哪些挑战?

    #17176 (https://github.com/apache/doris/issues/17176) 在 Apache Doris 社区是一个特殊的存在.跟大多开源社区相似的地方在于,这属于社区 ...

  2. Libevent初探

    Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...

  3. libevent evhttp学习——http服务端

    http服务端相对客户端要简单很多,我们仍旧使用libevent-2.1.5版本,服务端接口和2.0版本没有区别 基本流程 http服务端使用到的借口函数及流程如下 创建event_base和evht ...

  4. libevent实现http server

    libevent 是一个事件触发的网络库,适用于 windows.linux.bsd .Android 等多种平台,内部使用 select.epoll.kqueue .完成端口等系统调用管理事件机制. ...

  5. 开源组件websocket-sharp中基于webapi的httpserver使用体验

    一.背景 因为需要做金蝶ERP的二次开发,金蝶ERP的开放性真是不错,但是二次开发金蝶一般使用引用BOS.dll的方式,这个dll对newtonsoft.json.dll这个库是强引用,必须要用4.0 ...

  6. 使用libevent多线程验证Linux上的服务器惊群现象

    什么是惊群现象? 惊群(thundering herd)是指,只有一个子进程能获得连接,但所有N个子进程却都被唤醒了,这种情况将使性能受损. 举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终 ...

  7. Linux下的Memcache安装(含libevent的安装)

    Linux下Memcache服务器端的安装 服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 . 下载:http://www.danga.com/memca ...

  8. libevent源码深度剖析

    原文地址:http://blog.csdn.net/sparkliang/article/details/4957667 libevent源码深度剖析一 --序幕 张亮 1 前言 Libevent是一 ...

  9. libevent介绍

    libevent是一款事件驱动的网络开发包 由于采用 c 语言开发 体积小巧,跨平台,速度极快. 通常我们在建立服务器的处理模型的时候,主要是下面集中模型; (1)    a new Connecti ...

最新文章

  1. HDU1013 POJ1519 Digital Roots(解法二)
  2. 测量几种不同颜色的LED的V-A 曲线,以及它们作为STM32的P2(Boot1)下拉电阻
  3. 气候变迁给社会带来什么变化?
  4. linux 循环每个月,SHELL脚本每月最后一天判断
  5. matlab gui 中指定axes窗口画进度条
  6. 【theano-windows】学习笔记六——theano中的循环函数scan
  7. JS 获取浏览器、显示器 窗体等宽度和高度
  8. 网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常
  9. 漫谈高数曲线积分的物理意义
  10. oracle 段空间收缩,Oracle10g用Shrink Space收缩Oracle数据段
  11. 系统设计挖个坑(未填)
  12. mysql all privilege权限
  13. oracle序列的描述,Oracle同义词和序列的基本使用方法
  14. python selenium 自动化 第四章-实用selenium+python实现web自动化测试第四节
  15. Paypal支付(一)MPL真正的快捷支付
  16. android 输入法类说明
  17. DDD的哲学意味(上)
  18. Linux操作系统之网络管理
  19. 数据可视化--实验4
  20. 饥荒高脚鸟蛋孵化教程

热门文章

  1. 计算机系统概述(思维导图)
  2. 浅谈漏洞思路分享-只有登录框的渗透测试
  3. 浅谈工业级4G通信模块适配流程---一个做通信模块十多年的老工程师的经验之谈
  4. 小学老师 音乐 计算机,小学音乐教师个人工作总结(通用10篇)
  5. SQL 查询没有学过“林一”老师的同学的学号、姓名
  6. 智慧工厂整体解决方案
  7. oracle 计算年累计,ORACLE计算累计和
  8. 东华OJ基础题88 你要乘坐的飞碟在这里
  9. 关于NodeJs使用multer实现文件上传以及实现下载
  10. 删除数组中指定的元素