tcp: Check both wfds and efds when waiting for the result from connect
On windows, a connection failure doesn't trigger wfds as it does on unix. This fixes issue 2237, based on code by yeyingxian. Originally committed as revision 25154 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
c0bc8b9afb
commit
b416267622
@ -38,7 +38,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
|
|||||||
struct addrinfo hints, *ai, *cur_ai;
|
struct addrinfo hints, *ai, *cur_ai;
|
||||||
int port, fd = -1;
|
int port, fd = -1;
|
||||||
TCPContext *s = NULL;
|
TCPContext *s = NULL;
|
||||||
fd_set wfds;
|
fd_set wfds, efds;
|
||||||
int fd_max, ret;
|
int fd_max, ret;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
socklen_t optlen;
|
socklen_t optlen;
|
||||||
@ -87,11 +87,13 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
|
|||||||
}
|
}
|
||||||
fd_max = fd;
|
fd_max = fd;
|
||||||
FD_ZERO(&wfds);
|
FD_ZERO(&wfds);
|
||||||
|
FD_ZERO(&efds);
|
||||||
FD_SET(fd, &wfds);
|
FD_SET(fd, &wfds);
|
||||||
|
FD_SET(fd, &efds);
|
||||||
tv.tv_sec = 0;
|
tv.tv_sec = 0;
|
||||||
tv.tv_usec = 100 * 1000;
|
tv.tv_usec = 100 * 1000;
|
||||||
ret = select(fd_max + 1, NULL, &wfds, NULL, &tv);
|
ret = select(fd_max + 1, NULL, &wfds, &efds, &tv);
|
||||||
if (ret > 0 && FD_ISSET(fd, &wfds))
|
if (ret > 0 && (FD_ISSET(fd, &wfds) || FD_ISSET(fd, &efds)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user