1 初始化
main() 函数
->server_sockets()
-> server_socket()
创建新的socket,
//绑定socket到网卡
bind(sfd, next->ai_addr, next->ai_addrlen) == -1
//监听端口
if (!IS_UDP(transport) && listen(sfd, settings.backlog) == -1)
->conn_new()
//设置回调函数event_handler,event_handler网络消息
event_set(&c->event, sfd, event_flags, event_handler, (void *)c);
//加入到event base中
event_base_set(base, &c->event);
c->ev_flags = event_flags;
if (event_add(&c->event, 0) == -1) {
perror("event_add");
return NULL;
}
设置完后,开始进入循环监听
/* enter the event loop */
if (event_base_loop(main_base, 0) != 0) {
retval = EXIT_FAILURE;
}
2 有新的连接到来
event_handler()
->drive_machine()
//接收连接请求
sfd = accept(c->sfd, (struct sockaddr *)&addr, &addrlen);
//分配该请求到处理线程中
->dispatch_conn_new(sfd, conn_new_cmd, EV_READ | EV_PERSIST,
DATA_BUFFER_SIZE, tcp_transport);
CQ_ITEM *item = cqi_new();
int tid = (last_thread + 1) % settings.num_threads;
LIBEVENT_THREAD *thread = threads + tid;
//把该连接加入处理线程的队列中
cq_push(thread->new_conn_queue, item);
//通知线程处理任务
buf[0] = 'c';
write(thread->notify_send_fd, buf, 1)