Commit b4162676 authored by Martin Storsjö's avatar Martin Storsjö

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
parent c0bc8b9a
...@@ -38,7 +38,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment