#include <event2/event.h>
#include <event2/listener.h>
#include <string.h>
#include <iostream>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
using namespace std;
#define SPORT 5001
static void CLINET_READ_CB(bufferevent* ev, void* arg)
{
cout<<"[R]"<<endl;
char szBuff[1024];
int read_len = 0;
memset(szBuff, 0x00, sizeof(szBuff));
read_len = bufferevent_read(ev, szBuff, sizeof(szBuff)-1);
cout<<"read data:"<<szBuff<<endl;
/*if (strstr(szBuff, "quit"))
{
cout<<"quit"<<endl;
bufferevent_free(ev);
return;
}
bufferevent_write(ev, "OK", 2);
*/
}
static void CLINET_WRITE_CB(bufferevent* ev, void* arg)
{
cout<<"[W]"<<endl;
FILE* fp = (FILE*)arg;
int read_len = 0;
char szBuff[1024];
memset(szBuff, 0x00, sizeof(szBuff));
read_len = fread(szBuff, 1, sizeof(szBuff)-1, fp);
if (read_len <= 0)
{
fclose(fp);
//读取完毕后不释放,防止缓存中数据没有发送完
//bufferevent_free(ev);
bufferevent_disable(ev, EV_WRITE);
return;
}
cout<<szBuff<<endl;
bufferevent_write(ev, szBuff, read_len);
}
//超时、出错、断开连接时事件回调函数被调起
static void CLINET_EVENT_CB(bufferevent* ev, short what, void* arg)
{
cout<<"[E]"<<endl;
//超时操作,则断开连接
if (what&BEV_EVENT_TIMEOUT)
{
cout<<"timeout"<<endl;
bufferevent_free(ev);
return;
}
else if (what&BEV_EVENT_CONNECTED)
{
cout<<"connected"<<endl;
//触发write事件
bufferevent_trigger(ev, EV_WRITE, 0);
}
else if (what&BEV_EVENT_ERROR)
{
cout<<"error"<<endl;
bufferevent_free(ev);
return;
}
else if (what&BEV_EVENT_EOF)
{
cout<<"BEV_EVENT_EOF"<<endl;
bufferevent_free(ev);
return;
}
else
{
cout<<"others"<<endl;
bufferevent_free(ev);
return;
}
}
int main()
{
int res = 0;
FILE* fp = NULL;
//创建libevent的上下文
event_base * base = event_base_new();
if (!base)
{
cerr << "event_base_new error!" << endl;
return -1;
}
bufferevent* pbev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
//设置并绑定ip地址和端口
sockaddr_in sn;
memset(&sn, 0, sizeof(sn));
sn.sin_family = AF_INET;
sn.sin_port = htons(SPORT);
evutil_inet_pton(AF_INET, "127.0.0.1", &sn.sin_addr.s_addr);
fp = fopen("Makefile", "rb");
if (!fp)
{
cerr<<"fopen error"<<endl;
return -1;
}
bufferevent_setcb(pbev, CLINET_READ_CB, CLINET_WRITE_CB, CLINET_EVENT_CB, (void*)fp);
bufferevent_enable(pbev, EV_READ|EV_WRITE);
res = bufferevent_socket_connect(pbev, (sockaddr*)&sn, sizeof(sn));
if (res == 0)
{
cout<<"connect success"<<endl;
}
//事件分发处理
event_base_dispatch(base);
event_base_free(base);
return 0;
}
bufferevent client
最新推荐文章于 2021-08-06 11:21:20 发布