windows下libevent VS2012编译

来源:互联网 发布:fifa online mac 编辑:程序博客网 时间:2024/05/20 14:20

首先在http://libevent.org/上下载最先的libevent压缩包。

源文件有个问题,evutil.c源码修改这部分 

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #ifdef WIN32  
  2. #include <winsock2.h>  
  3. #include <ws2tcpip.h>  
  4. #pragma comment(lib,"ws2_32.lib")   
  5. #define WIN32_LEAN_AND_MEAN  
  6. #include <windows.h>  
  7. #undef WIN32_LEAN_AND_MEAN  
  8. #include <io.h>  
  9. #include <tchar.h>  
  10. #endif  

不然使用会失败;

打开VS2012开发工具命令行,cd 到libevent目录;

键入 

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. nmake /f Makefile.nmake  

完成编译,生成libevent_core.lib libevent_extras.lib libevent.lib。

新建VS工程,把lib加入链接器路径,libevent文件夹下的include文件夹拷贝过来,加入C++文件路径,并把libevent文件夹下的WIN32-Code\event2\event-config.h拷贝到include文件夹下,这样就ok了。

运行sample的代码:

#include "stdafx.h"#include <string.h>#include <errno.h>#include <stdio.h>#include <signal.h>#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib")#include <event2/bufferevent.h>#include <event2/buffer.h>#include <event2/listener.h>#include <event2/util.h>#include <event2/event.h>static const char MESSAGE[] = "Hello, World!\n";static const int PORT = 9995;static void listener_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *);static void conn_read(struct bufferevent *bev, void *user_data);static void conn_writecb(struct bufferevent *, void *);static void conn_eventcb(struct bufferevent *, short, void *);static void signal_cb(evutil_socket_t, short, void *);int main(int argc, char **argv){WSADATA wsa_data;WSAStartup(0x0201, &wsa_data);struct event_base *base = event_base_new();if (!base) {fprintf(stderr, "Could not initialize libevent!\n");return 1;}struct sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(PORT);struct evconnlistener *listener = evconnlistener_new_bind(base, listener_cb, (void *)base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, (struct sockaddr*)&sin, sizeof(sin));if (!listener) {fprintf(stderr, "Could not create a listener!\n");return 1;}struct event *signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base);if (!signal_event || event_add(signal_event, NULL) < 0) {fprintf(stderr, "Could not create/add a signal event!\n");return 1;}event_base_dispatch(base);evconnlistener_free(listener);event_free(signal_event);event_base_free(base);printf("done\n");return 0;}static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *user_data){struct event_base *base = (event_base *)user_data;struct bufferevent *bev;bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);if (!bev) {fprintf(stderr, "Error constructing bufferevent!");event_base_loopbreak(base);return;}bufferevent_setcb(bev, conn_read, conn_writecb, conn_eventcb, user_data);bufferevent_enable(bev, EV_WRITE | EV_READ | EV_PERSIST);}static void conn_writecb(struct bufferevent *bev, void *user_data){struct evbuffer *output = bufferevent_get_output(bev);if (evbuffer_get_length(output) == 0) {printf("flushed answer\n");//bufferevent_free(bev);}}static void conn_read(struct bufferevent *bev, void *user_data){evutil_socket_t fd = bufferevent_getfd(bev);char cData[MAX_PATH] = {0};while (bufferevent_read(bev, cData, MAX_PATH) > 0){bufferevent_write(bev, MESSAGE, strlen(MESSAGE));}}static void conn_eventcb(struct bufferevent *bev, short events, void *user_data){if (events & BEV_EVENT_EOF) {printf("Connection closed.\n");}else if (events & BEV_EVENT_ERROR) {//printf("Got an error on the connection: %s\n", strerror(errno));/*XXX win32*/}/* None of the other events can happen here, since we haven't enabled* timeouts */bufferevent_free(bev);}static void signal_cb(evutil_socket_t sig, short events, void *user_data){struct event_base *base = (event_base *)user_data;struct timeval delay = { 2, 0 };printf("Caught an interrupt signal; exiting cleanly in two seconds.\n");event_base_loopexit(base, &delay);}


0 0
原创粉丝点击