1. 程式人生 > >Windows 上靜態編譯 Libevent 2.0.10 並實現一個簡單 HTTP 伺服器

Windows 上靜態編譯 Libevent 2.0.10 並實現一個簡單 HTTP 伺服器

      假設 Visual Studio 2005 的安裝路徑為“D:\Program Files\Microsoft Visual Studio 8\”,Libevent 2.0.10 解壓後的路徑為“D:\libevent-2.0.10-stable”。

編譯生成Libevent 2.0.10靜態連結庫

  1.修改“D:\libevent-2.0.10-stable\event_iocp.c”、“D:\libevent-2.0.10-stable\evthread_win32.c”、“D:\libevent-2.0.10-stable\listener.c”三個檔案,在檔案開頭分別加上一行:

       #define _WIN32_WINNT 0x0500

  2、滑鼠點選Windows左下角的【開始】-【所有程式】,找到【Microsoft Visual Studio 2005】,執行下圖中的指令碼:

點選在新視窗中瀏覽此圖片

    3、按照下圖中的方法編譯Libevent 2.0.10:

點選在新視窗中瀏覽此圖片

    4、生成的“libevent.lib”、“libevent_core.lib”、“libevent_extras.lib”三個檔案就是我們需要的 Libevent 靜態連結庫。

點選在新視窗中瀏覽此圖片

利用 Libevent 靜態連結庫,實現一個簡單的 HTTP Web伺服器程式

   1.開啟 Visual Studio 2005,新建一個專案

     點選在新視窗中瀏覽此圖片

2、選擇在“d:\test”目錄內建立一個“Win32 控制檯應用程式”

點選在新視窗中瀏覽此圖片

    3、按照下圖進行選擇

點選在新視窗中瀏覽此圖片

    4、建立完成專案後,會自動生成“d:\test\httpd\”目錄,在該目錄內建立一個“httpd.c”檔案,內容如下:

#include <stdio.h>  
  
#define WIN32_LEAN_AND_MEAN  
#include <windows.h>  
#include <winsock2.h>  
  
#include <event.h>  
#include <evhttp.h>  
  
void root_handler(struct evhttp_request *req, void *arg)  
{  
    struct 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(struct evhttp_request *req, void *arg)  
{  
    struct 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 main(int argc, wchar_t* argv[])  
{  
  struct evhttp *httpd;  
  
  WSADATA wsaData;  
  DWORD Ret;  
  if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)  {  
    printf("WSAStartup failed with error %d\n", Ret);  
    return -1;  
  }  
  
    event_init();  
  
    httpd = evhttp_start("0.0.0.0", 8505);  
    if(!httpd){  
    return 1;  
  }  
  
    evhttp_set_cb(httpd, "/", root_handler, NULL);  
    evhttp_set_gencb(httpd, generic_handler, NULL);  
  
  printf("httpd server start OK!\n");  
  
    event_dispatch();  
  
    evhttp_free(httpd);  
  
  WSACleanup();  
    return 0;  
}

     5、回到 Visual Studio 2005,在左側的【原始檔】中選擇【新增】-【現有項】,將上一步建立的“httpd.c”檔案新增進來。

       點選在新視窗中瀏覽此圖片

 6、在【解決方案“httpd”】上點選滑鼠右鍵,選擇【屬性】

             點選在新視窗中瀏覽此圖片

    7、將【配置】改為“Release”

           點選在新視窗中瀏覽此圖片

  8、將“D:\libevent-2.0.10-stable\include”整個目錄複製到“D:\test\httpd\include”;將“D:\libevent-2.0.10-stable\WIN32-Code”目錄內的“tree.h”檔案和“event2”子目錄,複製到“D:\test\httpd\include\”內;將“D:\libevent-2.0.10-stable\”目錄內的所有“*.h”標頭檔案複製到“D:\test\httpd\include\”內。可以在Windows左下角的【開始】-【執行】中輸入“cmd”回車,在命令列視窗中執行以下命令,完成複製過程。

mkdir D:\test\httpd\include\
xcopy /E /H /R D:\libevent-2.0.10-stable\include\* D:\test\httpd\include\
xcopy /E /H /R D:\libevent-2.0.10-stable\WIN32-Code\* D:\test\httpd\include\
xcopy /E /H /R D:\libevent-2.0.10-stable\*.h D:\test\httpd\include\

          點選在新視窗中瀏覽此圖片

       點選在新視窗中瀏覽此圖片

     9、回到 Visual Studio 2005,在左側選單中【解決方案“httpd”】下面一行【httpd】上點選滑鼠郵件,選擇【屬性】,對每項內容進行修改。下圖中紅框內的資料即為修改後的資料。

       點選在新視窗中瀏覽此圖片

      點選在新視窗中瀏覽此圖片

      點選在新視窗中瀏覽此圖片

     點選在新視窗中瀏覽此圖片

 注:下圖中,附加依賴項填寫:ws2_32.lib wsock32.lib libevent.lib libevent_core.lib libevent_extras.lib

   忽略特定庫填寫:libc.lib;msvcrt.lib;libcd.lib;libcmtd.lib;msvcrtd.lib

   點選在新視窗中瀏覽此圖片

    10、完成設定後,在【解決方案“httpd”】上點選滑鼠右鍵,選擇【生成解決方案】。如果是重新編譯,可以選擇【重新生成解決方案】。生成成功後,“d:\test\httpd\Release”目錄內的“httpd.exe”即為生成的可執行檔案。

        點選在新視窗中瀏覽此圖片

     11、雙擊“httpd.exe”執行後,開啟瀏覽器,訪問“http://127.0.0.1:8505/”,則可以看到以下資訊:一個簡單的 HTTP Web Server 輸出的內容。

        點選在新視窗中瀏覽此圖片

    12、如果你覺得像DOS程式一樣的“httpd.exe”可執行檔案圖示不好看、沒有顯示版本資訊,那麼,你可以按照下圖步驟,新增ICO圖示檔案。

點選在新視窗中瀏覽此圖片   點選在新視窗中瀏覽此圖片

 13、新增版本資訊

點選在新視窗中瀏覽此圖片 點選在新視窗中瀏覽此圖片

     14、大功告成,下面顯示的是帶有自定義圖示、版本資訊的“httpd.exe”可執行程式。

         點選在新視窗中瀏覽此圖片