常用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 */
}
待更新。。。