大家说说libevent使用的经验吧。
时间:2010-09-19
来源:互联网
本帖最后由 ccnuliu 于 2010-09-19 18:48 编辑
大家说说libevent使用的经验吧。
我写了一个例子
第一 不知道撒时候释放client结构。我怎么知道客户端已经关闭了?
第二 释放client结构的时候,我需要调用event_del函数吗?
当建立了一个tcp连接的时候,如果双方不关闭
是始终保持打开的吗? 需要发心跳包来保持连接吗?
event_del() 是删除 之前event_set的事件吧。
另外 event_add的作用是干嘛的呢?
复制代码
大家说说libevent使用的经验吧。
我写了一个例子
第一 不知道撒时候释放client结构。我怎么知道客户端已经关闭了?
第二 释放client结构的时候,我需要调用event_del函数吗?
当建立了一个tcp连接的时候,如果双方不关闭
是始终保持打开的吗? 需要发心跳包来保持连接吗?
event_del() 是删除 之前event_set的事件吧。
另外 event_add的作用是干嘛的呢?
- #include"event.h"
- #include<list>
- #include<sys/socket.h>
- #include<iostream>
- #include <errno.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <fcntl.h>
- using namespace std;
-
- struct EventData
- {
- struct event readev;
- struct event writeev;
- EventData()
- {
- memset(&readev,0,sizeof(readev));
- memset(&writeev,0,sizeof(writeev));
- }
- };
-
- int setNoblock(int fd)
- {
- int flags = fcntl(fd, F_GETFL);
- if(flags < 0)
- {
- return flags;
- }
- flags|=O_NONBLOCK;
- if(fcntl(fd,F_SETFL,flags)<0)
- {
- return -1;
- }
- return 0;
- }
- void Onread(int fd,short sev,void *agrv)
- {
- struct EventData ev;
- if(agrv==NULL)
- {
- return ;
- }
- ev = *(struct EventData *)agrv;
- //free(agrv);
- agrv = NULL;
-
- char buf[1024] = {0};
- int len = 0;
- if(( len = read(fd,buf,sizeof(buf)) )<0)
- {
- cout<<"read error"<<endl;
- close(fd);
- event_del(&ev.readev);
- return;
- }
- else if(len == 0)
- {
- cout<<"client disconnected;"<<endl;
- close(fd);
- event_del(&ev.readev);
- return;
- }
- //cout<<"recv = "<<buf<<"recv size = "<<len<<endl;
- //event_del(&ev.readev);
- }
- void Onwrite(int fd,short sev,void *agrv)
- {
- cout<<"write = "<<fd<<endl;
- if(agrv==NULL)
- {
- return ;
- }
- struct EventData ev = *(struct EventData *)agrv;
- //free(agrv);
- agrv = NULL;
-
- char buf[1024] = "welcome to Huazhong";
- int len = 0;
- len=write(fd,buf,strlen(buf));
- if(len == -1)
- {
- if (errno == EINTR || errno == EAGAIN)
- {
- event_add(&ev.writeev,NULL);
- return ;
- }
- else
- {
- cout<<"write error"<<endl;
- close(fd);
- event_del(&ev.writeev);
- return;
- }
- }
- //event_del(&ev.writeev);
- }
-
- void OnAccept(int fd,short ev,void *agrv)
- {
- int clientFd;
- struct sockaddr cli_Addr;
- socklen_t len = sizeof(cli_Addr);
-
- if((clientFd = accept(fd,(struct sockaddr*)&cli_Addr,&len)) <0)
- {
- cout<<"accept failed"<<endl;
- close(fd);
- return ;
- }
- setNoblock(clientFd);
- EventData *client = (EventData*)malloc(sizeof(EventData));
- if(client == NULL)
- {
- cout<<"memmory haven't none"<<endl;
- return;
- }
- cout<<"client = "<<clientFd<<endl;
- event_set(&client->readev,clientFd,EV_READ,Onread,client);
- event_add(&client->readev,NULL);
-
- event_set(&client->writeev,clientFd,EV_WRITE,Onwrite,client);
- event_add(&client->writeev,NULL);
- }
-
- int main(int agrn,char* agrv[])
- {
- if(agrn<=2)
- {
- cout<<"ip,port"<<endl;
- return 0;
- }
- int listenFd = -1;
- listenFd = socket(AF_INET,SOCK_STREAM,0);
- setNoblock(listenFd);
- if(listenFd < 0)
- {
- cout<<"Create socket failed"<<endl;
- return -1;
- }
- cout<<"create socket sucess"<<endl;
- struct sockaddr_in serv_addr;
- memset(&serv_addr,0,sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_port = htons(atoi(agrv[2]));
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- if( bind(listenFd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0 )
- {
- cout<<"bind failed"<<endl;
- return -1;
- }
- cout<<"bind sucess"<<endl;
- if(listen(listenFd,200)<0)
- {
- cout<<"listen Error..."<<endl;
- return -1;
- }
- cout<<"start listen....."<<endl;
- event ev_accept;
- event_init();
- event_set(&ev_accept,listenFd,EV_READ|EV_PERSIST,OnAccept,NULL);
- event_add(&ev_accept,NULL);
- event_dispatch();
- }
作者: ccnuliu 发布时间: 2010-09-19
1. recv 返回 0,表示客户端关闭了。
2. 要event_del
2. 要event_del
作者: zzyong08 发布时间: 2010-09-19
回复 zzyong08
在请问你一个问题:
当建立了一个tcp连接的时候,如果双方不关闭
是始终保持打开的吗? 需要发心跳包来保持连接吗?
event_del() 是删除 之前event_set的事件吧。
另外 event_add的作用是干嘛的呢?
在请问你一个问题:
当建立了一个tcp连接的时候,如果双方不关闭
是始终保持打开的吗? 需要发心跳包来保持连接吗?
event_del() 是删除 之前event_set的事件吧。
另外 event_add的作用是干嘛的呢?
作者: ccnuliu 发布时间: 2010-09-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28