2009年5月1日金曜日

windowsでlibeventしてみた

前から使ってみたいと思っていたlibevent。ようやく試してみる機会があった。

ん~。

当然IOCP対応してるんだろーと思ったらlibevent-1.4.10-stableでは未対応なのね...

libevent-2.0.1-alphaWhat's newにはIOCPに対応始めたみたいなことが書いてある。

vc90でビルドするのも一手間必要。

なんとかregressにパスするバイナリ作れたのでテストコード。

evhttpd.cc
#include <stdio.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>

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

#pragma comment(lib, "ws2_32")

struct EnableWinsock
{
EnableWinsock(){
WSADATA wsaData;
const int r = WSAStartup(MAKEWORD(2, 2), &wsaData);
}
~EnableWinsock(){
WSACleanup();
}
};

void root_handler(evhttp_request* req, void* arg)
{
evbuffer* buf = evbuffer_new();
if(!buf){
puts("failed to create response buffer");
return;
}

evbuffer_add_printf(buf, "Hello: %s\n", evhttp_request_uri(req));
evhttp_send_reply(req, HTTP_OK, "OK", buf);
}

void generic_handler(evhttp_request* req, void* arg)
{
evbuffer* buf = evbuffer_new();
if(!buf){
puts("failed to create response buffer");
return;
}

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

int wmain(int argc, wchar_t* argv[])
{
EnableWinsock enableWinsock;

event_init();

evhttp* httpd = evhttp_start("0.0.0.0", 8880);
if(!httpd){ return 1; }

evhttp_set_cb(httpd, "/", root_handler, NULL);
evhttp_set_gencb(httpd, generic_handler, NULL);

event_dispatch();

evhttp_free(httpd);

return 0;
}

0 件のコメント:

コメントを投稿