libevent(十)evhttp

用libevent构建一个http server非常方便,可参考libevent(七)http server

主要涉及的一个结构体是 evhttp:

struct evhttp {
    /* Next vhost, if this is a vhost. */
    TAILQ_ENTRY(evhttp) next_vhost;

    /* All listeners for this host */
    TAILQ_HEAD(boundq, evhttp_bound_socket) sockets;

    TAILQ_HEAD(httpcbq, evhttp_cb) callbacks;

    /* All live connections on this host. */
    struct evconq connections;

    TAILQ_HEAD(vhostsq, evhttp) virtualhosts;

    TAILQ_HEAD(aliasq, evhttp_server_alias) aliases;

    /* NULL if this server is not a vhost */
    char *vhost_pattern;

    int timeout;

    size_t default_max_headers_size;
    ev_uint64_t default_max_body_size;

    /* Bitmask of all HTTP methods that we accept and pass to user
     * callbacks. */
    ev_uint16_t allowed_methods;

    /* Fallback callback if all the other callbacks for this connection
       don‘t match. */
    void (*gencb)(struct evhttp_request *req, void *);
    void *gencbarg;

    struct event_base *base;
};
时间: 2024-10-15 18:19:32

libevent(十)evhttp的相关文章

libevent(十三)evhttp事件处理流程

在libevent(六)http server中,作为一个单线程http server,不仅要监听每个连接的到来,还要监听每个连接上的I/O事件. 查看源码可知,在evhttp_bind_socket中设置了accept的回调函数:accept_socket_cb. /* Listener callback when a connection arrives at a server. */ static void accept_socket_cb(struct evconnlistener *l

libevent(十二)信号事件

libevent通过socketpair实现对信号事件的监听. event_base结构体有个成员sig,结构如下: struct evsig_info { /* Event watching ev_signal_pair[1] */ struct event ev_signal; /* Socketpair used to send notifications from the signal handler */ evutil_socket_t ev_signal_pair[2]; /* Tr

libevent(十)bufferevent 2

接上文libevent(九)bufferevent 上文主要讲了bufferevent如何监听读事件,那么bufferevent如何监听写事件呢? 对于一个fd,只要它的写缓冲区没有满,就会触发写事件. 一般情况下,如果不向这个fd发送大量的数据,它的写缓冲区是不会满的. 所以,如果一开始就监听写事件,写事件会一直被触发. libevent的做法是: 当我们确实要向fd写入数据时,才监听该fd的写事件. 监听写事件 在用户回调函数中,可以通过 bufferevent_write 向输出缓冲out

PHP网络编程之深入Libevent(十五节)

大家周末好,这里有趣有用广告少的公众号高性能API社区,我是老李,本文属于<PHP网络编程>系列中的一个章节. 前两天老孟跟我说: 毫不要脸地说,我写的这些文章都不属于快餐消耗品,你不动手亲自实践是压根搞不定的,哪儿有那么容易就能得到的认知啊!况且我讲的并不全,有很多资料知识是需要你自己搜索补充的.而且老李自认为很少在公众号里瞎TM发没用的文章,几乎篇篇都是干货.水很少.很紧致,老铁们啊,听我一句劝: 春宵一刻值千金,绝知此事要躬行 我看了一下<PHP网络编程>整本书的整体进度,由

libevent源码深度剖析十二

libevent源码深度剖析十二 --让libevent支持多线程张亮 Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libevent,跟源代码并没有太大的关系,纯粹是使用上的技巧. 1 错误使用示例 在多核的CPU上只使用一个线程始终是对不起CPU的处理能力啊,那好吧,那就多创建几个线程,比如下面的简单服务器场景.1 主线程创建工作线程1:2 接着主线程监听在端口上,等待新的连接:3 在线程1中执行event事件循环,等待事

libevent源码深度剖析十

libevent源码深度剖析十 --支持I/O多路复用技术张亮 Libevent的核心是事件驱动.同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows.Linux. Unix等不同平台上却各有不同,如何能提供优雅而统一的支持方式,是首要关键的问题,这其实不难,本节就来分析一下. 1 统一的关键 Libevent支持多种I/O多路复用技术的关键就在于结构体eventop,这个结构体前面也曾提到过,它的成员是一系列的函数指针, 定义在event-internal

Linux C编程之十九(1) libevent基本概念

一.libevent是干什么的 1. 开源的库, 提高开发效率 封装了socket通信 封装了IO多路转接 2. 精简, 专注于网络, 性能高 3. 事件驱动 二.libevent库的安装 1. 官方网站: http://libevent.org 2. 源码包下载: 1.4.x -- 适合源码学习 2.x 3. 源码包的安装 (1)./configure --prefix == /usr/xxxxx 检测安装环境 生成makefile (2)make 编译源代码 生成一些库 (a. 动态, 静态

Libevent::evhttp服务器下载

void http_handler_Get_Download(struct evhttp_request *req, void *arg) { if (req == NULL) { return; } const char *uri = evhttp_request_get_uri(req); string strUrl(uri); string strFilePath = DPC::get_Url_path(strUrl, "path="); printf("FilePat

Libevent教程001: 简介与配置

本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable 版本为准. 本文为系列文章的第一篇, 对应libevent-book的 chapter 0 + chapter 1 + R0 + R1 0. 前提条件 这个文档是对libevent的介绍与指导, 阅读文档需要你具有以下的能力: 你精通C语言 你至少了解Unix网络编程. 你会安装libevent 你