libevent是一个高性能的事件触发的网络库,采用C语言编写,它使用事件机制出发某些操作,它能够跨平台使用。
libevent包括事件管理,缓存管理,DNS,HTTP,缓存事件几个部分。
它三种类型的事件,分别是网络IO、定时器、信号三种。
支持多线程,每个线程中需要关联到自己的event_base上。
libevent的一些使用资料:
libevent的简单使用
http://blog.csdn.net/mafuli007/article/details/7476014定时器的使用
此处展示的是怎样使用定时器事件,每隔一秒输出一次Game Over!
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <event.h>
using namespace std;
void onTime(int sock, short event, void *arg)
{
cout << "Game Over!" << endl;
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
event_add((struct event*)arg, &tv);
}
int main(int argc, char *argv[])
{
int ret = EXIT_SUCCESS;
event_init(); //初始化libevent库
struct event evTime;
evtimer_set(&evTime, onTime, &evTime);//给event赋值
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
event_add(&evTime, &tv);//将event增加到事件监控中
event_dispatch();//开始事件循环
return ret;
}
- TCP服务器
这个例子展示了怎样使用IO事件,此处使用的是网络IO,当客户端发送数据到服务端时,服务端会触发IO事件,然后输出内容。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <event.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
using namespace std;
struct event_base *base;
int server(int argc, char *argv[]);
int client(int argc, char *argv[]);
void onRead(int iCliFd, short iEvent, void *arg)
{
int iLen;
char buf[1500];
iLen = recv(iCliFd, buf, 1500, 0);
if(iLen <= 0)
{
cout << "Client Close" << endl;
struct event *pEvRead = (struct event *)arg;
event_del(pEvRead);
delete pEvRead;
close(iCliFd);
return;
}
buf[iLen] = 0;
cout << "Client Info:" << buf << endl;
}
void onAccept(int iSvrFd, short iEvent, void *arg)
{
int iCliFd;
struct sockaddr_in sCliAddr;
socklen_t iSinSize = sizeof(sCliAddr);
iCliFd = accept(iSvrFd, (struct sockaddr *)&sCliAddr, &iSinSize);
struct event *pEvRead = new event;
event_set(pEvRead, iCliFd, EV_READ|EV_PERSIST, onRead, pEvRead);
event_base_set(base, pEvRead);
event_add(pEvRead, NULL);
}
int main(int argc, char *argv[])
{
int ret = 0;
if(argc == 2)
{
if(strcmp(argv[1], "server") == 0)
{
ret = server(argc, argv);
}
else if(strcmp(argv[1], "client") == 0)
{
ret = client(argc, argv);
}
}
}
int client(int argc, char *argv[])
{
int sockfd, n;
char recvline[4096], sendline[4096];
struct sockaddr_in servaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(8888);
if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{
printf("connect error!\n");
exit(0);
}
strcpy(sendline, "hello world!");
send(sockfd, sendline, strlen(sendline), 0);
close(sockfd);
return 0;
}
int server(int argc, char *argv[])
{
int iSvrFd;
struct sockaddr_in sSvrAddr;
memset(&sSvrAddr, 0, sizeof(sSvrAddr));
sSvrAddr.sin_family = AF_INET;
sSvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sSvrAddr.sin_port = htons(8888);
iSvrFd = socket(AF_INET, SOCK_STREAM, 0);
bind(iSvrFd, (struct sockaddr*)&sSvrAddr, sizeof(sSvrAddr));
listen(iSvrFd, 0);
base = event_base_new();
struct event evListen;
event_set(&evListen, iSvrFd, EV_READ|EV_PERSIST, onAccept, NULL);
event_base_set(base, &evListen);
event_add(&evListen, NULL);
event_base_dispatch(base);
return 0;
}