关于客户端源码hiredis读取服务端响应的问题
作者: wangfly80创建于 2018年11月17日更新于 2018年11月17日
读取服务器响应时,没有对 TCP 数据流进行粘包和拆包,这应该是有问题的。调用 read 返回的 nread 长度不一定等于一条完整消息的长度,可能会小于。int redisBufferRead(redisContext *c) { char buf[1024 * 16]; int nread; /* 如果上下文中出现错误,则提前返回。 */ if (c->err) return REDIS_ERR; nread = read(c->fd, buf, sizeof(buf)); if (nread == -1) { if (errno == EAGAIN && !(c->flags & REDIS_BLOCK)) { /* 稍后再试一次。 */ } else { __redisSetError(c, REDIS_ERR_IO, NULL); return REDIS_ERR; } } else if (nread == 0) { __redisSetError(c, REDIS_ERR_EOF, "Server closed the connection"); return REDIS_ERR; } else { if (redisReaderFeed(c->reader, buf, nread) != REDIS_OK) { __redisSetError(c, c->reader->err, c->reader->errstr); return REDIS_ERR; } } return REDIS_OK; }
内容来源: huangzworks/redis-3.0-annotated