`
king_c
  • 浏览: 223837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ref:Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器

 
阅读更多

 

 

原文地址:http://www.s135.com/libevent_windows

 

本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe。

  假设 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”文件,内容如下:

  1. #include <stdio.h>   
  2.   
  3. #define WIN32_LEAN_AND_MEAN   
  4. #include <windows.h>   
  5. #include <winsock2.h>   
  6.   
  7. #include <event.h>   
  8. #include <evhttp.h>   
  9.   
  10. void root_handler(struct evhttp_request *req, void *arg)   
  11. {   
  12.     struct evbuffer *buf = evbuffer_new();   
  13.     if(!buf){   
  14.         puts("failed to create response buffer");   
  15.         return;   
  16.     }   
  17.   
  18.     evbuffer_add_printf(buf, "Hello: %s\n", evhttp_request_uri(req));   
  19.     evhttp_send_reply(req, HTTP_OK, "OK", buf);   
  20. }   
  21.   
  22. void generic_handler(struct evhttp_request *req, void *arg)   
  23. {   
  24.     struct evbuffer *buf = evbuffer_new();   
  25.     if(!buf){   
  26.         puts("failed to create response buffer");   
  27.         return;   
  28.     }   
  29.   
  30.     evbuffer_add_printf(buf, "Requested: %s\n", evhttp_request_uri(req));   
  31.     evhttp_send_reply(req, HTTP_OK, "OK", buf);   
  32. }   
  33.   
  34. int main(int argc, wchar_t* argv[])   
  35. {   
  36.   struct evhttp *httpd;   
  37.   
  38.   WSADATA wsaData;   
  39.   DWORD Ret;   
  40.   if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)  {   
  41.     printf("WSAStartup failed with error %d\n", Ret);   
  42.     return -1;   
  43.   }   
  44.   
  45.     event_init();   
  46.   
  47.     httpd = evhttp_start("0.0.0.0", 8505);   
  48.     if(!httpd){   
  49.     return 1;   
  50.   }   
  51.   
  52.     evhttp_set_cb(httpd, "/", root_handler, NULL);   
  53.     evhttp_set_gencb(httpd, generic_handler, NULL);   
  54.   
  55.   printf("httpd server start OK!\n");   
  56.   
  57.     event_dispatch();   
  58.   
  59.     evhttp_free(httpd);   
  60.   
  61.   WSACleanup();   
  62.     return 0;   
  63. }   



  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”可执行程序。

  点击在新窗口中浏览此图片



  附1:编译好的 Libevent 2.0.10 静态链接库与 httpd 的 Visual Studio 2005 工程源代码下载



  附2:ICO图标制作工具下载


 

分享到:
评论

相关推荐

    libevent实现http服务器实现文件下载功能

    由于VS2019是一个Windows开发环境,我们需要下载适用于Windows的libevent源码,然后使用Visual Studio的CMake工具进行配置和编译,确保生成适用于VS2019的静态或动态链接库。 接下来,我们需要创建一个简单的HTTP...

    libevent-2.0.22-stable在windows环境下使用mingw编译

    标题"libevent-2.0.22-stable在windows环境下使用mingw编译"指的是一个关于使用MinGW编译工具在Windows操作系统上构建libevent库的2.0.22稳定版本的过程。libevent是一个开源的、跨平台的事件通知库,它提供了一种...

    libevent 多线程 HTTP post服务器

    描述中提到的“libevent 多线程 HTTP post服务器”表明这是一个利用libevent库开发的服务端程序,该程序能够接收并处理来自客户端的HTTP POST请求,并且采用了多线程技术以实现并发处理,提升系统性能。这通常意味着...

    libevent v2.0.10源码(跨平台事件触发的网络库)

    libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨...

    libevent web服务器实现

    这是一个使用libevent实现的web服务器,客户端采用CInternetSession来实现的,是一个完整的可用的例子,项目采用cmake来管理。提供给大家参考,有问题可以邮件给buptxu@qq.com,多谢。

    VS2008静态编译libevent-2.1.8支持openssl

    压缩包里面有静态编译好的openssl1.0.2和libevent-2.1.8,以及libevent的源代码及编译方法,openssl的编译方法请看:https://mp.csdn.net/postedit/81085150

    windows下的libevent静态库

    在Windows环境下,libevent的静态库版本为libevent-2.0.19,这意味着它包含了一系列预编译的.lib文件,无需在项目中链接到libevent的动态库(.dll),从而避免了运行时对特定.dll文件的依赖。 **libevent的核心功能...

    libevent-2.0.22 windows和linux下的静态库,附源码和libevent使用手册

    libevent-2.0.22-stable.tar.gz源码编译的Windows和Linux下的静态库,另附源码,电子书《libevent参考手册(中文版).pdf》、《libevent源码深度剖析.pdf》、《LibeventBook.pdf》。 Linux环境下该libevent静态库修改...

    libevent-vs2017编译

    总结起来,这个压缩包为开发者提供了一个在Visual Studio 2017环境下编译和调试Libevent的便捷途径,使得深入学习和使用Libevent变得更为容易。通过理解Libevent的核心概念和使用方法,开发者可以构建出高效、可靠的...

    Libevent2.0.21编译好的库

    例如,他们可以创建一个服务器,当有新的客户端连接时,libevent_core.lib会处理网络连接,libevent.lib则负责调度事件,libevent_extras.lib可能用于实现HTTP服务或者进行DNS查询。 在实际开发中,首先需要将这些...

    VS2015编译后的libevent头文件和库文件——基于libevent-2.1.10

    libevent是一个开源的事件通知库,它在C语言中实现,广泛应用于网络编程,尤其是服务器端的高并发处理。它通过提供一个统一的API,使得开发者能够方便地处理各种I/O事件,如网络套接字、信号、定时器等。在本资源中...

    libevent实现UDP relay服务器与客户端

    **一、libevent实现UDP relay服务器** 1. **初始化libevent库**:在服务器端,首先需要初始化libevent库,设置事件基础(event_base),这通常是程序的入口点。事件基础管理事件处理和调度。 2. **创建UDP监听套接...

    vs编译libevent 可调试

    本话题主要涉及如何在Visual Studio 2008环境下编译和调试libevent库,这是一个广泛应用于网络事件处理的高性能库。libevent-2.0.22是本文讨论的具体版本,这个版本包含了对多种事件机制的支持,如select、poll、...

    libevent 2.1.12版本,编译好的全部文件,包含lib和头文件

    总的来说,libevent 2.1.12版本是一个强大且可靠的事件库,它的全面文件包包含了预编译的库文件和头文件,方便开发者在自己的项目中快速集成和使用。无论是初学者还是经验丰富的开发者,都能从中受益,实现高效的...

    libevent-2.0.10-stable.tar.gz

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows...

    【最新】C++ 使用libEvent实现http的post, get功能

    libEvent是一个跨平台的事件通知库,它允许程序员编写高性能的异步网络服务。本篇将深入探讨如何利用libEvent库在C++中实现HTTP的POST和GET请求。 首先,理解HTTP的基本概念至关重要。HTTP(超文本传输协议)是...

    c++版本libevent,仿照libevent写的一个服务器框架

    c++版本libevent,仿照libevent写的一个服务器框架,libevent的基本功能已实现,暂时不能在windows平台上使用,定时器是纯粹的timer wheel方式,与libevent的小根堆不一样,而且最大定时时间是固定的,暂时不支持...

    libevent(2.1.8)库及头文件文件

    7. **跨平台兼容性**:Libevent的一个重要优势就是其跨平台能力,可以用于Windows、Linux、Mac OS X等多种操作系统,并且在不同平台上都能保持一致的API和行为。 **文件名称列表解析** 压缩包内的文件名"libevent-...

    libevent对应Android下的库文件

    **标题与描述解析** 标题提及的是"libevent对应...在实际开发中,开发者根据项目需求选择链接这些库中的一个或多个,并通过NDK的JNI(Java Native Interface)接口与Java代码交互,实现Android应用的原生性能优化。

    libevent和线程池配合实现的高并发tcp服务器

    全部C代码,linux下的线程池和libevent配合实现的高并发tcp服务器,tcp通讯采用分帧的方式发包,帧包含帧头和数据部分,使用libevent的bufferevent方式来实现的帧提取,可直接使用GCC来编译。还配套有一个C#写的...

Global site tag (gtag.js) - Google Analytics