memcached iov msglist

来源:互联网 发布:nginx 允许指定ip访问 编辑:程序博客网 时间:2024/06/03 17:24
最近研究memcached 的iov部分,把理解的相关东西做个笔记,防止忘了,有错误之处也欢迎各位指摘。微笑struct msghdr{void *msg_name; /* Socket name */int msg_namelen; /* Length of name */struct iovec *msg_iov; /* Data blocks */int msg_iovlen; /* Number of blocks */有几个iov块void *msg_accrights; /* Per protocol magic (eg BSD file descriptor passing) */int msg_accrightslen; /* Length of rights list */};telnet localhost 11211后set key 0 0 4key1get key...分析1VALUE key 0 4key1分析1:gdb(如何用gdb见http://blog.csdn.net/yxnyxnyxnyxnyxn/article/details/7955259)跟踪:3995            switch (transmit(c)) {(gdb) stransmit (fd=<value optimized out>, which=<value optimized out>, arg=0x7fffe8013560) at memcached.c:36913691    if (c->msgcurr < c->msgused &&(gdb) n3692            c->msglist[c->msgcurr].msg_iovlen == 0) {(gdb) 3691    if (c->msgcurr < c->msgused &&(gdb) 3698        struct msghdr *m = &c->msglist[c->msgcurr];(gdb) 3700        res = sendmsg(c->sfd, m, 0);(gdb) 3701        if (res > 0) {(gdb) p res$20 = <value optimized out>(gdb) n3700        res = sendmsg(c->sfd, m, 0);(gdb) p res$21 = <value optimized out>(gdb) n3701        if (res > 0) {(gdb) p res$22 = 26(gdb) l3696    if (c->msgcurr < c->msgused) {3697        ssize_t res;3698        struct msghdr *m = &c->msglist[c->msgcurr];36993700        res = sendmsg(c->sfd, m, 0);3701        if (res > 0) {3702            pthread_mutex_lock(&c->thread->stats.mutex);3703            c->thread->stats.bytes_written += res;3704            pthread_mutex_unlock(&c->thread->stats.mutex);3705(gdb) p c->msglist[c->msgcurr]$23 = {msg_name = 0x7fffe80136d8, msg_namelen = 16, msg_iov = 0x7fffe8014e80, msg_iovlen = 4, msg_control = 0x0, msg_controllen = 0, msg_flags = 0}(gdb) p c->msglist[c->msgcurr].msg_iovmsg_iov     msg_iovlen  (gdb) p c->msglist[c->msgcurr].msg_iov$24 = (struct iovec *) 0x7fffe8014e80(gdb) p c->msglist[c->msgcurr].msg_iov.buf没有名为 buf 的成员(gdb) p c->msglist[c->msgcurr].msg_iov[0].iov_base$25 = (void *) 0x412097(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[0].iov_base$26 = 0x412097 "VALUE "(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[1].iov_base$27 = 0x7ffff7e2b048 "key"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[2].iov_base$28 = 0x7ffff7e2b04c " 0 4\r\nkey1\r\n"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[3].iov_base$29 = 0x411944 "END\r\n"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[4].iov_base$30 = 0x0msg_iovlen = 4 //(3+1)if (add_iov(c, “VALUE “, 6) ||add_iov(c, ITEM_key(it), it->nkey) ||add_iov(c, ITEM_suffix(it), it->nsuffix + it->nbytes))用了3个iov结构体,add_iov() {    c->msgbytes += len;    c->iovused++;    m->msg_iovlen++;}调用完了之后执行下面的语句:add_iov(c, "END\r\n", 5)add_iov() { c->msgbytes += len; c->iovused++; m->msg_iovlen++;// 加到了4}res:26发送成功的字节数VALUE key 0 4 key1\r\nEND\r\nset key 0 0 4key1set key1 0 0 4key2get key key2                VALUE key 0 4key1VALUE key2 0 4key2(gdb) p c->msglist[c->msgcurr]$52 = {msg_name = 0x7fffe80136d8, msg_namelen = 16, msg_iov = 0x7fffe8014e80, msg_iovlen = 7, msg_control = 0x0, msg_controllen = 0, msg_flags = 0}(gdb) n3708            while (m->msg_iovlen > 0 && res >= m->msg_iov->iov_len) {(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[0].iov_base$53 = 0x412097 "VALUE "(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[1].iov_base$54 = 0x7ffff7e2b048 "key"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[2].iov_base$55 = 0x7ffff7e2b04c " 0 4\r\nkey1\r\n"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[3].iov_base$56 = 0x412097 "VALUE "(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[4].iov_base$57 = 0x7ffff7e2b0a8 "key2"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[5].iov_base$58 = 0x7ffff7e2b0ad " 0 4\r\nkey2\r\n"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[6].iov_base$59 = 0x411944 "END\r\n"(gdb) p (char *)c->msglist[c->msgcurr].msg_iov[7].iov_base$60 = 0x0


原创粉丝点击