Use recv/send instead of read/write

The recv/send calls are more portable than read/write, since unlike the
latter, the former work with Windows sockets.

We also check for EWOULDBLOCK instead of EAGAIN. On most Unices, EAGAIN
and EWOULDBLBOCK are the same thing. However, on Windows they are
different, and send/recv are expected to give EWOULDBLOCK for
non-blocking sockets.
This commit is contained in:
m 2019-03-31 18:10:34 +02:00 committed by Marcus Geelnard
parent e84086cb92
commit 1d092a235a

8
net.c
View File

@ -65,9 +65,9 @@ void redisNetClose(redisContext *c) {
} }
int redisNetRead(redisContext *c, char *buf, size_t bufcap) { int redisNetRead(redisContext *c, char *buf, size_t bufcap) {
int nread = read(c->fd, buf, bufcap); int nread = recv(c->fd, buf, bufcap, 0);
if (nread == -1) { if (nread == -1) {
if ((errno == EAGAIN && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) { if ((errno == EWOULDBLOCK && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) {
/* Try again later */ /* Try again later */
return 0; return 0;
} else { } else {
@ -83,9 +83,9 @@ int redisNetRead(redisContext *c, char *buf, size_t bufcap) {
} }
int redisNetWrite(redisContext *c) { int redisNetWrite(redisContext *c) {
int nwritten = write(c->fd, c->obuf, sdslen(c->obuf)); int nwritten = send(c->fd, c->obuf, sdslen(c->obuf), 0);
if (nwritten < 0) { if (nwritten < 0) {
if ((errno == EAGAIN && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) { if ((errno == EWOULDBLOCK && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) {
/* Try again later */ /* Try again later */
} else { } else {
__redisSetError(c, REDIS_ERR_IO, NULL); __redisSetError(c, REDIS_ERR_IO, NULL);