libevent中的evconnlistener_new_bind()函数解析

时间:2022-09-16 00:14:15
函数原型:struct evconnlistener *evconnlistener_new_bind(struct event_base *base,
evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,
const struct sockaddr *sa, int socklen);

第一个参数代表你的主事件,也就是你创建的event_base

第二个参数代表回调函数,触发可读事件之后,返回给我们需要的信息

第三个参数代表需要额外传递的参数

第四个参数代表标志位 1.LEV_OPT_REUSEABLE 设置地址复用,内部函数原型应该为setsocketopt(sockfd, SOL_SOCKET, SO_RESUEADDR, on, sizeof(on))

LEV_OPT_CLOSE_ON_FREE代表连接关闭时同事关闭底层套接字

第五个参数代表监听的最大数量,如果设置为-1系统将选择一个合适的数值,如果为-1,内部实现的数值为128(固定的)跟SOMAXCONN一样的值

第六个参数代表需要绑定的地址

第七个参数代表地址的大小

函数内部创建了一个listenfd根据你的参数是否设置为非阻塞(evutil_make_socket_nonblocking())函数进行设置,这个函数的内部为fcntl函数(flags=fcntl(fd, F_GETFL), flags |= O_NONBLOCK, fcntl(fd, F_SETFL, flags))进行设置

然后进行地址绑定(bind()),在创建一个evconnlistener *类型的对象用evconnlistener_new()函数来进行创建

evconnlistener_new()函数内部进行监听(listen()), 创建一个evconnlistener_event的监听事件,将主事件,listenfd,回调函数,evconnlistener_event进行绑定。这个回调函数为listener_read_cb函数,当着个函数被调用的时候,内部进行accept一个connfd,进而调用我们自己的回调函数read/write等操作