beanstalkd源码分析--命令处理流程

本文详细介绍了Beanstalk服务端如何处理客户端连接请求的过程,包括客户端连接建立、命令回调函数设置及命令处理函数的具体实现等内容。

概述

本文讲述了beanstalk的命令处理流程。

处理客户端连接请求

前面已经讲过,当服务启动时会把处理函数设置成srvaccept,用来建立客户端的tcp连接请求。

void
srvserve(Server *s) 
{
    ...
    // 设置处理函数
    s->sock.f = (Handle)srvaccept;
    ...

    // 进入死循环,用来处理连接建立和读写事件
    // 当一个客户端连接到来时,先建立连接
    for (;;) {
        period = prottick(s);

        int rw = socknext(&sock, period);
        if (rw == -1) {
            twarnx("socknext");
            exit(1);
        }

        if (rw) {
            sock->f(sock->x, rw);
        }
    }

和客户端建立连接后

当和客户端完成tcp三次握手,建立tcp连接后,把回调函数设成处理命令的函数,如下:

void
h_accept(const int fd, const short which, Server *s)
{
    ...
    c->sock.f = (Handle)prothandle;
    c->sock.fd = cfd;

    // 把cfd加入到事件监控队列中,监控该cfd的读事件
    r = sockwant(&c->sock, 'r'); 
    ...
}

回调函数设置完成后,还需要把完成连接的cfd加入到事件处理机制中,来处理该cfd的读/写的请求。

进入命令处理函数

static void
prothandle(Conn *c, int ev)
{
    h_conn(c->sock.fd, ev, c);
}

读取客户端命令,并处理

以下函数处理连接的状态,若读取正确,调用do_cmd处理命令。

static void
h_conn(const int fd, const short which, Conn *c)
{
    ...
    conn_data(c);
    while (cmd_data_ready(c) && (c->cmd_len = cmd_len(c))) do_cmd(c);
    ...
}

总结

本文总结了beanstalk的命令处理整个流程。可见,beanstalk的代码简洁,易懂,代码风格也很好。具体的命令实现,请看下回分解。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值