libevent初体验

来源:互联网 发布:sql server 双机冗余 编辑:程序博客网 时间:2024/05/13 08:47

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;}
0 0