memecached 网络模型分析

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值