diff --git a/network.c b/network.c index c58d38e0..7aaab0f7 100644 --- a/network.c +++ b/network.c @@ -321,7 +321,7 @@ CreateSocketAdress( } oldopts = fcntl(self->sockid, F_GETFL, 0); if (! (oldopts | O_NONBLOCK)) { - /* assume success when in blocking bmode */ + /* assume success when in blocking mode */ return 1; } FD_ZERO(&wmask); @@ -331,17 +331,22 @@ CreateSocketAdress( iret = select(self->sockid+1, &rmask, &wmask, NULL, &tmo); if (iret == 0) return 0; /* in progress */ if (iret > 0) { - if (FD_ISSET(self->sockid, &wmask)) { - if (FD_ISSET(self->sockid, &rmask)) { - iret = recv(self->sockid, NULL, 0, 0); + /* the connection has either succeded or failed + - the write flag indicates success + - the read flag indicates, if there is already data pending + the read flag should not appear without the write flag + */ + if (FD_ISSET(self->sockid, &wmask)) { /* should always be true */ + if (FD_ISSET(self->sockid, &rmask)) { /* there may already be data for read */ + iret = recv(self->sockid, NULL, 0, 0); /* zero length, check only return value */ if (iret >= 0) { - iret = 1; - } + iret = 1; /* success */ + } /* else failure */ } else { - iret = send(self->sockid, NULL, 0, 0); + iret = send(self->sockid, NULL, 0, 0); /* zero length, check only return value */ if (iret >= 0) { - iret = 1; - } + iret = 1; /* success */ + } /* else failure */ } } }