rio的connwrite和connread该怎么写呢?折腾我很久,参考开源代码后,搞定:
- static size_t rioConnWrite(rio *r, const void *buf, size_t len) {
- UNUSED(r);
- UNUSED(buf);
- UNUSED(len);
- return 0; /* Error, this target does not yet support writing. */
- }
-
- /* Returns 1 or 0 for success/failure. */
- static size_t rioConnRead(rio *r, void *buf, size_t len) {
- size_t avail = sdslen(r->io.conn.buf)-r->io.conn.pos;
-
- /* If the buffer is too small for the entire request: realloc. */
- if (sdslen(r->io.conn.buf) + sdsavail(r->io.conn.buf) < len)
- r->io.conn.buf = sdsMakeRoomFor(r->io.conn.buf, len - sdslen(r->io.conn.buf));
-
- /* If the remaining unused buffer is not large enough: memmove so that we
- * can read the rest. */
- if (len > avail && sdsavail(r->io.conn.buf) < len - avail) {
- sdsrange(r->io.conn.buf, r->io.conn.pos, -1);
- r->io.conn.pos = 0;
- }
-
- /* If we don't already have all the data in the sds, read more */
- while (len > sdslen(r->io.conn.buf) - r->io.conn.pos) {
- size_t buffered = sdslen(r->io.conn.buf) - r->io.conn.pos;
- size_t needs = len - buffered;
- /* Read either what's missing, or PROTO_IOBUF_LEN, the bigger of
- * the two. */
- size_t toread = needs < PROTO_IOBUF_LEN ? PROTO_IOBUF_LEN: needs;
- if (toread > sdsavail(r->io.conn.buf)) toread = sdsavail(r->io.conn.buf);
- if (r->io.conn.read_limit != 0 &&
- r->io.conn.read_so_far + buffered + toread > r->io.conn.read_limit)
- {
- /* Make sure the caller didn't request to read past the limit.
- * If they didn't we'll buffer till the limit, if they did, we'll
- * return an error. */
- if (r->io.conn.read_limit >= r->io.conn.read_so_far + len)
- toread = r->io.conn.read_limit - r->io.conn.read_so_far - buffered;
- else {
- errno = EOVERFLOW;
- return 0;
- }
- }
- int retval = connRead(r->io.conn.conn,
- (char*)r->io.conn.buf + sdslen(r->io.conn.buf),
- toread);
- if (retval <= 0) {
- if (errno == EWOULDBLOCK) errno = ETIMEDOUT;
- return 0;
- }
- sdsIncrLen(r->io.conn.buf, retval);
- }
-
- memcpy(buf, (char*)r->io.conn.buf + r->io.conn.pos, len);
- r->io.conn.read_so_far += len;
- r->io.conn.pos += len;
- return len;
- }
-