天天看點

VS2010下libevent的如何使用

官網:

http://libevent.org/

以libevent-2.0.22-stable為例,

1、解壓縮libevent-2.0.22-stable.tar.gz。

2、打開“Visual Studio 指令提示(2010)”,進入第1步解壓後的檔案夾,例如:E:\libevent-2.0.22-stable,執行指令“nmake /f Makefile.nmake”,編譯完之後,會在路徑下生成3個lib檔案,分别是libevent.lib、libevent_core.lib、libevent_extras.lib。我們建立lib檔案夾,存放這3個檔案。

VS2010下libevent的如何使用

libevent_core :所有核心的事件和緩沖功能,包含了所有的 event_base 、 evbuffer 、 bufferevent 和工具函數。

libevent_extra :定義了程式可能需要,也可能不需要的協定特定功能,包括 HTTP、 DNS 和 RPC。

libevent:這個庫因為曆史原因而存在 ,它包含 libevent_core 和 libevent_extra 的内容。 不應該使用這個庫,未來版本的 libevent 可能去掉這個庫。

3、建立VS2010的工程時,除了需要使用到上面的3個lib檔案,還需要E:\libevent-2.0.22-stable\include\和E:\libevent-2.0.22-stable\WIN32-Code\。

我們把E:\libevent-2.0.22-stable\WIN32-Code\下面的檔案夾和檔案拷貝到E:\libevent-2.0.22-stable\include\下面。

我們把include檔案夾更名為“inc_libevent”。然後把“lib”檔案夾放入“inc_libevent”。

VS2010下libevent的如何使用

4、把“inc_libevent”檔案夾拷貝到VS2010的工程。

(1).h檔案

VS2010下libevent的如何使用

#include <event2/bufferevent.h>

#include <event2/bufferevent_compat.h>

#include <event2/buffer.h>

#include <event2/listener.h>

#include <event2/util.h>

#include <event2/event.h>

#include <event2/http.h>

#include <event2/buffer_compat.h>

#include <event2/http_struct.h>

#include <event2/thread.h>

(2).lib檔案

#pragma comment(lib, "ws2_32.lib")

#pragma comment(lib, "wsock32.lib")

#pragma comment(lib, "inc_libevent\\lib\\libevent.lib")

#pragma comment(lib, "inc_libevent\\lib\\libevent_core.lib")

#pragma comment(lib, "inc_libevent\\lib\\libevent_extras.lib")

5、win32的示例

// libEvt_test.cpp : 定義控制台應用程式的入口點。

//

#include "stdafx.h"

#include <string.h>  

#include <iostream>  

using namespace std;

static void accept_conn_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr* addr, int len, void *ptr)

{

/* get libevent event_base from listener */

struct event_base* base = evconnlistener_get_base(listener);

cout<<"accept a link"<<endl;

}

int _tmain(int argc, _TCHAR* argv[])

WSADATA WSAData;

WSAStartup(0x0201, &WSAData);

struct event_base* base;

base = event_base_new();

struct sockaddr_in sin;

/* init addr 初始化綁定位址和端口*/

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET;

sin.sin_addr.s_addr = htonl(0);//等價于inet_addr("127.0.0.1");

sin.sin_port = htons(6666);

struct evconnlistener* listener;

/* init a libevent listener 給event_base綁定位址和端口,設定監聽屬性,設定回調函數 (如果使用evconnlistenner_new函數的話需要自己來綁定端口和初始化socket,并把socket_fd傳遞給該函數)*/

listener = evconnlistener_new_bind(base, accept_conn_cb, NULL, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,(struct sockaddr*)&sin, sizeof(sin));

/* start loop for accept_conn_cb */

event_base_dispatch(base);

getchar();

return 0;

6、推薦幾篇參考文章:

(1)高性能、高并發TCP伺服器(多線程調用libevent)

http://blog.csdn.net/i_am_jojo/article/details/7587838 http://download.csdn.net/detail/aillean/7521245

(2)libevent帶負載均衡的多線程使用示例

http://blog.chinaunix.net/uid-756931-id-353318.html

(3)對libevent+多線程伺服器模型的C++封裝類

http://www.tuicool.com/articles/QBj2ma

繼續閱讀