libevent常用API

常用API,总结下

创建一个event_base

struct event_base *event_base_new(void);
void event_base_free(struct event_base *base);
//退出事件循环,两个的区别:break立即退出,exit先执行完回调函数,再退出
int event_base_loopexit(struct event_base *base, const struct timeval *tv);
int event_base_loopbreak(struct event_base *base);

使用events工作

#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
#define EV_PERSIST 0x10
#define EV_ET 0x20
typedef void (*event_callback_fn)(evutil_socket_t, short, void *);
struct event *event_new(struct event_base *base, evutil_socket_t fd, short what, event_callback_fn cb,
void *arg);
void event_free(struct event *event);

超时事件

#define evtimer_new(base, callback, arg) \
event_new((base), -1, 0, (callback), (arg))
#define evtimer_add(ev, tv) \
event_add((ev),(tv))
#define evtimer_del(ev) \
event_del(ev)
#define evtimer_pending(ev, tv_out) \
event_pending((ev), EV_TIMEOUT, (tv_out))

信号事件

#define evsignal_new(base, signum, callback, arg) \
event_new(base, signum, EV_SIGNAL|EV_PERSIST, cb, arg)
#define evsignal_add(ev, tv) \
event_add((ev),(tv))
#define evsignal_del(ev) \
event_del(ev)
#define evsignal_pending(ev, what, tv_out) \
event_pending((ev), (what), (tv_out))

添加事件(pending)

int event_add(struct event *ev, const struct timeval *tv);
int event_del(struct event *ev);

辅助函数

int evutil_make_socket_nonblocking(evutil_socket_t sock);
int evutil_make_listen_socket_reuseable(evutil_socket_t sock);
int evutil_make_socket_closeonexec(evutil_socket_t sock);

bufferevent事件

貌似只支持TCP
创建一个socket-based bufferevent

//创建一个bufferevent事件和fd相关联
struct bufferevent *bufferevent_socket_new(
struct event_base *base, evutil_socket_t fd, enum bufferevent_options options);
//options如下
BEV_OPT_CLOSE_ON_FREE
BEV_OPT_THREADSAFE
BEV_OPT_DEFER_CALLBACKS
BEV_OPT_UNLOCK_CALLBACKS

基于socket-based的bufferevent建立连接

int bufferevent_socket_connect(struct bufferevent *bev,
struct sockaddr *address, int addrlen);

释放bufferevent

void bufferevent_free(struct bufferevent *bev);

对bufferevent设置回调函数

typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);
typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short events, void *ctx);

void bufferevent_setcb(struct bufferevent *bufev,
bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg);

//加入事件循环
void bufferevent_enable(struct bufferevent *bufev, short events);

读写缓冲区

int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);

size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);

获取base

struct event_base *bufferevent_get_base(struct bufferevent *bev);

接受TCP连接

struct evconnlistener *evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb, void *ptr, unsigned flags, int backlog, const struct sockaddr *sa, int socklen);
//关于flags
LEV_OPT_LEAVE_SOCKETS_BLOCKING
LEV_OPT_CLOSE_ON_FREE(一般选上)
LEV_OPT_CLOSE_ON_EXEC
LEV_OPT_REUSEABLE(一般选上)
LEV_OPT_THREADSAFE
LEV_OPT_DISABLED
LEV_OPT_DEFERRED_ACCEPT

void evconnlistener_free(struct evconnlistener *lev);

listenfd的回调函数

typedef void (*evconnlistener_cb)(struct evconnlistener *listener, evutil_socket_t sock, struct sockaddr *addr, int len, void *ptr);

另外关于socket一些需要用的,也写这了
创建socket的一些步骤

struct sockaddr_in address;
::bzero(&address, sizeof(address));

address.sin_family = AF_INET;
//address.sin_addr.s_addr = INADDR_ANY;
const char *ip = "xxx.xxx.xxx.xxx";
inet_aton(ip, &(address.sin_addr));
address.sin_port = htons(12345);
//字符串转换为ip
int inet_aton(const char *cp, struct in_addr *inp);
//ip转为字符串
char *inet_ntoa(struct in_addr in);

根据主机名获取IP地址,根据IP地址获取主机名

#include <netdb.h>
struct hostent *gethostbyname(const char *name);

struct hostent 
{
    char  *h_name;          /* official name of host */
    char **h_aliases;         /* alias list */
    int    h_addrtype;        /* host address type */
    int    h_length;          /* length of address */
    char **h_addr_list;       /* list of addresses */
}

待更新。。。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值