標籤:style blog http color io os 使用 ar strong
libevent是一個事件觸發的網路程式庫,適用於windows、linux、bsd等多種平台,內部使用select、epoll、kqueue等系統調用管理事件機制。著名分布式緩衝軟體memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根據libevent官方網站上公布的資料統計,似乎也有著非凡的效能。
1、下載編譯libevent
下載當前最新的libevent穩定版本libevent-2.0.21-stable.tar.gz安裝包,解壓到某個固定目錄。開啟Visual Studio的Command Prompt終端,進入libevent-2.0.21-stable目錄,輸入如下指令編譯libevent程式碼程式庫:
nmake /f Makefile.nmake
2、收集libevent相關標頭檔和庫檔案
libevent編譯完成後,產生的相關靜態庫檔案包括三個:libevent.lib libevent_core.lib libevent_extras.lib,可以單獨建立一個lib檔案夾存放;
相關的標頭檔包括三個地方:(1)libevent-2.0.12-stable\include\* (2)libevent-2.0.12-stable\WIN32-Code\* (3)libevent-2.0.12-stable\*.h
把這些標頭檔都複製一下放到一個單獨的include檔案夾中方便管理。
3、在VS工程中指定libevent的include和lib檔案夾
有兩個地方指定:(1)建立一個工程後,在工程的“配置屬性”-->“C/C++”-->“常規”-->“附加元件封裝含目錄”中給出include檔案夾路徑;(2)直接在VS“工具”-->“選項”-->“項目和解決方案”-->“VC++目錄”中給出include和lib目錄路徑。
相比而言,第一種方式我發現在代碼中雖然編譯不會出錯,但是不能自動定位標頭檔和函數位置;第二種方式就能夠清晰定位出libevent標頭檔和函數的位置。
4、設定工程“執行階段程式庫”屬性
在工程的“配置屬性”-->“C/C++”-->“代碼產生”-->“執行階段程式庫”中選擇“多線程(/MT)”。
5、設定工程依賴和忽略函數庫
在工程的“配置屬性”-->“連結器”-->“輸入”中指出“附加依賴項”包括:ws2_32.lib wsock32.lib libevent.lib libevent_core.lib libevent_extras.lib
在“忽略特定庫”包括:libc.lib;msvcrt.lib;libcd.lib;libcmtd.lib;msvcrtd.lib
6、測試代碼
來一段測試代碼試一下:
1 #include <stdio.h> 2 #define WIN32_LEAN_AND_MEAN 3 #include <windows.h> 4 #include <winsock2.h> 5 #include <event.h> 6 #include <evhttp.h> 7 void root_handler(struct evhttp_request *req, void *arg) 8 { 9 struct evbuffer *buf = evbuffer_new();10 if(!buf)11 {12 puts("failed to create response buffer");13 return;14 }15 evbuffer_add_printf(buf, "Hello: %s\n", evhttp_request_uri(req));16 evhttp_send_reply(req, HTTP_OK, "OK", buf);17 } 18 19 void generic_handler(struct evhttp_request *req, void *arg)20 {21 struct evbuffer *buf = evbuffer_new();22 if(!buf)23 {24 puts("failed to create response buffer");25 return;26 }27 evbuffer_add_printf(buf, "Requested: %s\n", evhttp_request_uri(req));28 evhttp_send_reply(req, HTTP_OK, "OK", buf);29 }30 31 int main(int argc, wchar_t* argv[])32 {33 struct evhttp *httpd; 34 WSADATA wsaData;35 DWORD Ret;36 if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)37 {38 printf("WSAStartup failed with error %d\n", Ret);39 return -1;40 }41 event_init();42 httpd = evhttp_start("0.0.0.0", 8505);43 if(!httpd)44 {45 return 1;46 }47 evhttp_set_cb(httpd, "/", root_handler, NULL);48 evhttp_set_gencb(httpd, generic_handler, NULL);49 printf("httpd server start OK!\n");50 event_dispatch();51 evhttp_free(httpd);52 WSACleanup();53 return 0;54 }
View Code
[原]網路程式庫libevent在Visual Studio中的使用方法