libevent webserver in 40 lines of c

Libevent provides cross-platform asynchronous callbacks on sockets and file descriptors. Different operating systems have different ways of handling this efficiently, for example linux has kernel support for this operation which can scale to tens of thousands of sockets. It’s all pretty complicated but libevent makes it very simple. Along with a basic api that is used by highly scalable projects like memcached and thrift, it also has asyncronus a dns lookup api and a http server api.

Here’s an example of how simple it is to write a basic http server.

#include <sys/types.h>
#include <sys/time.h>
#include <sys/queue.h>#include <stdlib.h>

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

void generic_handler(struct evhttp_request *req, void *arg)
{
        struct evbuffer *buf;
        buf = evbuffer_new();

        if (buf == NULL)
            err(1, "failed to create response buffer");

        evbuffer_add_printf(buf, "Requested: %sn", evhttp_request_uri(req));
        evhttp_send_reply(req, HTTP_OK, "OK", buf);
}

int main(int argc, char **argv)
{
    struct evhttp *httpd;

    event_init();
    httpd = evhttp_start("0.0.0.0", 8080);

    /* Set a callback for requests to "/specific". */
    /* evhttp_set_cb(httpd, "/specific", another_handler, NULL); */

    /* Set a callback for all other requests. */
    evhttp_set_gencb(httpd, generic_handler, NULL);

    event_dispatch();

    /* Not reached in this code as it is now. */
    evhttp_free(httpd);

    return 0;
}

But is it fast? check out the benchmarks (on my laptop):

ab -c 1000 -n 10000 http://localhost/

Apache2: Requests per second: 1274.14 [#/sec] (mean)

libevent: Requests per second: 1584.37 [#/sec] (mean)

Kickass!

[del.icio.us] [Digg] [dzone] [Google] [Mixx] [Reddit] [StumbleUpon]
Writen by jake

3 Responses to “libevent webserver in 40 lines of c”

  1. Link Box « handthrow Says:

    […] some crazy event-driven server. Maybe something like Third Rail’s example of how to write a simple web server using libevent in only 40 lines of […]

  2. Jerk Face Says:

    You sure worked hard including evhttp.h which provided all the functionality for you.

  3. Arek Says:

    Hey, I found this page on google just recently and I wanted to add something about libevent, well mainly that ‘libev’ has been around for a few months now and I think that it has some major advantages over libevent.

    Libev doesn’t have a built in webserver, it leaves that to the developer to code , or it can emulate libevent if the libevent httpd server is required. I’ve written a small server based on ‘libev’ and compared it to other ones. Take a look :
    http://www.zenebo.com/word/asynchronous-programming/lighttz-a-simple-and-fast-web-server/

    Feel free to take a look http://software.schmorp.de/pkg/libev.html

    cheers,

    arek bochinski

Leave a Reply