最近想看一下源码,大家都推荐了libevent。libevent1.4.13相对libevent2.0简洁很多,所以就拿他入手了。当然还是边调试边学习好些。以下就是vs2012调试libevnet的方法。 其他vs版本应该也是一样的。
1.下载源码 libevent-1.4.13-stable.tar.gz 并解压
2.新建vs工程
3.\libevent-1.4.13-stable\libevent-1.4.13-stable\WIN32-Code 中的所有文件
\libevent-1.4.13-stable\libevent-1.4.13-stable\WIN32-Code\compat 中sys整个文件夹 (直接拷贝文件夹)
\libevent-1.4.13-stable\libevent-1.4.13-stable 中的下列文件: 挨着对比下吧,我也这样找的
在工程目录下新建include目录,将这三处拷贝到该目录下。再将include目录中所有的.h .c添加到工程中。如上图所。
将所有.c文件属性改为不使用预编译头。 文件可多选,一起设置。
4.点击项目属性 修改一下选项
预处理器定义HAVE_CONFIG_H _CRT_SECURE_NO_DEPRECATE 这两个
5.在项目的main函数cpp中。
添加头文件#include <winsock2.h>
和 #pragma comment(lib,"ws2_32.lib")
6.好了,可以编译运行了。
7.测试代码:
#include "stdafx.h"
#include <winsock2.h>
#include "event.h"
#include "time.h"
#include "signal.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")
void printff(int fd, short what, void *arg)
{
timeval tv;
event *timeEvent = (event *)arg;
int newtime = (int)time(NULL);
std::cout<<"时间事件触发"<<std::endl;
evutil_timerclear(&tv);
tv.tv_sec = 10;
raise(SIGBREAK);
event_add(timeEvent, &tv);
}
int called =0;
void signal_cb(int fd, short waht, void *arg)
{
struct event *signal = (event *)arg;
std::cout<<"信号事件触发"<<std::endl;
if (called >= 2)
event_del(signal);
called++;
}
int _tmain(int argc, _TCHAR* argv[])
{
event timeout_test;
event singal_test;
timeval tv;
event_init();
event_set(&timeout_test, -1, 0, printff, &timeout_test);
event_set(&singal_test, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb, &singal_test);
evutil_timerclear(&tv);
tv.tv_sec = 2;
event_add(&timeout_test, &tv);
event_add(&singal_test, NULL);
event_dispatch();
return 0;
}