Libevent 是一个异步IO的c语言网络库,带了一个简单的http支持
用c/c++写http server,也没有比这个更方便的做法了

但是比起php/ruby/python来,编程还是很繁琐,各种不方便,唉,写c语言的快绝种了

Libevent 写了一本很不错的文档,linux下写网络程序必看 Fast portable non-blocking network programming with Libevent

#include <event.h>
#include <evhttp.h>

#define BUF_MAX 1024*16

static char _buf[ BUF_MAX ];
void post_handler(struct evhttp_request *req, void *arg)
{

    std::string out;


    size_t post_size = EVBUFFER_LENGTH(req->input_buffer);

    printf("len = %d\n", post_size);
    if (post_size > 0 )
    {
        size_t copy_len = post_size > BUF_MAX ? BUF_MAX : post_size;
        memcpy (_buf, EVBUFFER_DATA(req->input_buffer), copy_len);
        out.assign(_buf, copy_len);
    }

    // process posted data

    struct evbuffer *pe = evbuffer_new();
    evbuffer_add(pe, out.data(), out.size());
    evhttp_send_reply(req, HTTP_OK, "OK", pe);
    evbuffer_free(pe);
}

evhttp_set_cb(http, "/post", post_handler, NULL);
  • 核心就在于 EVBUFFER_LENGTHEVBUFFER_DATA 两个宏,这是在 event.h 中定义的,得到buffer的头指针和长度,memcpy出来,随便处理
  • 这是Libevent 2.0.x 才支持的功能
  • 测试的时候用 curl 网址 -d "test" 或者 curl 网址 --data-binary @"/etc/profile" 提交数据
  • 这种post 提是直接post,并不是urlencode的方式

本文地址: http://lutaf.com/215.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接