+ -
当前位置:首页 → 问答吧 → 大家说说libevent使用的经验吧。

大家说说libevent使用的经验吧。

时间:2010-09-19

来源:互联网

本帖最后由 ccnuliu 于 2010-09-19 18:48 编辑

大家说说libevent使用的经验吧。


我写了一个例子
第一 不知道撒时候释放client结构。我怎么知道客户端已经关闭了?
第二  释放client结构的时候,我需要调用event_del函数吗?

当建立了一个tcp连接的时候,如果双方不关闭
是始终保持打开的吗? 需要发心跳包来保持连接吗?

event_del() 是删除 之前event_set的事件吧。


另外 event_add的作用是干嘛的呢?
  1. #include"event.h"
  2. #include<list>
  3. #include<sys/socket.h>
  4. #include<iostream>
  5. #include <errno.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. using namespace std;

  10. struct EventData
  11. {
  12.         struct event readev;
  13.         struct event writeev;
  14.         EventData()
  15.         {
  16.                 memset(&readev,0,sizeof(readev));
  17.                 memset(&writeev,0,sizeof(writeev));
  18.         }
  19. };

  20. int setNoblock(int fd)
  21. {
  22.         int flags = fcntl(fd, F_GETFL);
  23.         if(flags < 0)
  24.         {       
  25.                 return flags;
  26.         }       
  27.         flags|=O_NONBLOCK;
  28.         if(fcntl(fd,F_SETFL,flags)<0)
  29.         {
  30.                 return -1;
  31.         }
  32.         return 0;
  33. }
  34. void Onread(int fd,short sev,void *agrv)
  35. {
  36.         struct EventData ev;
  37.         if(agrv==NULL)
  38.         {
  39.                 return ;
  40.         }
  41.         ev = *(struct EventData *)agrv;
  42.         //free(agrv);
  43.         agrv = NULL;
  44.        
  45.         char buf[1024] = {0};
  46.         int len = 0;
  47.         if(( len = read(fd,buf,sizeof(buf)) )<0)
  48.         {
  49.                 cout<<"read error"<<endl;
  50.                 close(fd);
  51.                 event_del(&ev.readev);
  52.                 return;
  53.         }
  54.         else if(len == 0)
  55.         {
  56.                 cout<<"client disconnected;"<<endl;
  57.                 close(fd);
  58.                 event_del(&ev.readev);
  59.                 return;
  60.         }
  61.         //cout<<"recv = "<<buf<<"recv size = "<<len<<endl;
  62.         //event_del(&ev.readev);
  63. }
  64. void Onwrite(int fd,short sev,void *agrv)
  65. {
  66.         cout<<"write = "<<fd<<endl;
  67.         if(agrv==NULL)
  68.         {
  69.                 return ;
  70.         }
  71.         struct EventData ev  = *(struct EventData *)agrv;
  72.         //free(agrv);
  73.         agrv = NULL;
  74.        
  75.         char buf[1024] = "welcome to Huazhong";
  76.         int len = 0;
  77.         len=write(fd,buf,strlen(buf));
  78.         if(len == -1)
  79.         {
  80.                 if (errno == EINTR || errno == EAGAIN)
  81.                 {
  82.                         event_add(&ev.writeev,NULL);
  83.                         return ;
  84.                 }
  85.                 else
  86.                 {
  87.                         cout<<"write error"<<endl;
  88.                         close(fd);
  89.                         event_del(&ev.writeev);
  90.                         return;
  91.                 }
  92.         }
  93.         //event_del(&ev.writeev);
  94. }

  95. void OnAccept(int fd,short ev,void *agrv)
  96. {
  97.         int clientFd;
  98.         struct sockaddr cli_Addr;
  99.         socklen_t len = sizeof(cli_Addr);
  100.        
  101.         if((clientFd = accept(fd,(struct sockaddr*)&cli_Addr,&len)) <0)
  102.         {
  103.                 cout<<"accept failed"<<endl;
  104.                 close(fd);
  105.                 return ;
  106.         }
  107.         setNoblock(clientFd);
  108.         EventData *client = (EventData*)malloc(sizeof(EventData));
  109.         if(client == NULL)
  110.         {
  111.                 cout<<"memmory haven't none"<<endl;
  112.                 return;
  113.         }
  114.         cout<<"client = "<<clientFd<<endl;
  115.         event_set(&client->readev,clientFd,EV_READ,Onread,client);
  116.         event_add(&client->readev,NULL);

  117.         event_set(&client->writeev,clientFd,EV_WRITE,Onwrite,client);
  118.         event_add(&client->writeev,NULL);
  119. }

  120. int main(int agrn,char* agrv[])
  121. {
  122.         if(agrn<=2)
  123.         {
  124.                 cout<<"ip,port"<<endl;
  125.                 return 0;
  126.         }
  127.         int listenFd = -1;       
  128.         listenFd  = socket(AF_INET,SOCK_STREAM,0);
  129.         setNoblock(listenFd);
  130.         if(listenFd < 0)
  131.         {
  132.                 cout<<"Create socket failed"<<endl;
  133.                 return -1;
  134.         }
  135.         cout<<"create socket sucess"<<endl;
  136.         struct sockaddr_in serv_addr;
  137.         memset(&serv_addr,0,sizeof(serv_addr));
  138.         serv_addr.sin_family = AF_INET;
  139.         serv_addr.sin_port = htons(atoi(agrv[2]));
  140.         serv_addr.sin_addr.s_addr = INADDR_ANY;
  141.         if( bind(listenFd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0 )
  142.         {
  143.                 cout<<"bind failed"<<endl;
  144.                 return -1;
  145.         }
  146.         cout<<"bind sucess"<<endl;
  147.         if(listen(listenFd,200)<0)
  148.         {
  149.                 cout<<"listen Error..."<<endl;
  150.                 return -1;
  151.         }
  152.         cout<<"start listen....."<<endl;
  153.         event ev_accept;
  154.         event_init();
  155.         event_set(&ev_accept,listenFd,EV_READ|EV_PERSIST,OnAccept,NULL);
  156.         event_add(&ev_accept,NULL);
  157.         event_dispatch();
  158. }
复制代码

作者: ccnuliu   发布时间: 2010-09-19

1. recv 返回 0,表示客户端关闭了。
2. 要event_del

作者: zzyong08   发布时间: 2010-09-19

回复 zzyong08


   

在请问你一个问题:
当建立了一个tcp连接的时候,如果双方不关闭
是始终保持打开的吗? 需要发心跳包来保持连接吗?

event_del() 是删除 之前event_set的事件吧。


另外 event_add的作用是干嘛的呢?

作者: ccnuliu   发布时间: 2010-09-19