#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#define LISTEN_PORT 5100
#define LISTEN_BACKLOG 32
void read_cb(struct bufferevent *bufferEvent, void *arg);
void error_cb(struct bufferevent *bufferEvent, short event, void *arg);
void write_cb(struct bufferevent *bufferEvent, void *arg);
void listen_cb(struct evconnlistener *listener, evutil_socket_t fd,
struct sockaddr *addr, int socklen, void *ctx);
int main()
{
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(0);
sin.sin_port = htons(LISTEN_PORT);
struct event_base *base = event_base_new();
struct evconnlistener *listener = evconnlistener_new_bind(base, listen_cb, NULL,
LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
(struct sockaddr*)&sin, sizeof(sin));
event_base_dispatch(base);
return 0;
}
void listen_cb(struct evconnlistener *listener, evutil_socket_t fd,
struct sockaddr *addr, int socklen, void *ctx)
{
struct event_base *base = evconnlistener_get_base(listener);
struct bufferevent *bufferEvent = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bufferEvent, read_cb, NULL, error_cb, base);
bufferevent_enable(bufferEvent, EV_READ|EV_WRITE|EV_PERSIST);
}
void read_cb(struct bufferevent *bufferEvent, void *arg)
{
struct evbuffer *input = bufferevent_get_input(bufferEvent);
struct evbuffer *output = bufferevent_get_output(bufferEvent);
size_t len = evbuffer_get_length(input);
evbuffer_remove_buffer(input, output, len);
//evbuffer_add_buffer(output, input);
}
void write_cb(struct bufferevent *bufferEvent, void *arg)
{
}
void error_cb(struct bufferevent *bufferEvent, short event, void *arg)
{
evutil_socket_t fd = bufferevent_getfd(bufferEvent);
if (event & BEV_EVENT_TIMEOUT)
{
std::cout << "fd:" << fd << std::endl;
std::cout << "time out" << std::endl;
}
else if (event & BEV_EVENT_EOF)
{
std::cout << "connection closed" << std::endl;
}
else if (event & BEV_EVENT_ERROR)
{
std::cout << "error" << std::endl;
bufferevent_free(bufferEvent);
}
}
libevent echo服务端程序
最新推荐文章于 2020-08-19 20:37:14 发布