libevent初体验

libevent是一个高性能的事件触发的网络库,采用C语言编写,它使用事件机制出发某些操作,它能够跨平台使用。
libevent包括事件管理,缓存管理,DNS,HTTP,缓存事件几个部分。
它三种类型的事件,分别是网络IO、定时器、信号三种。
支持多线程,每个线程中需要关联到自己的event_base上。

#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值