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:
parent
e84086cb92
commit
1d092a235a
8
net.c
8
net.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user