Always register for TCP events even if there are no outstanding queries, as the other side could always close the connection, which is a valid event which should be responded to.

This commit is contained in:
Steinar H. Gunderson 2007-09-28 15:53:10 +00:00
parent 63ac6156aa
commit 36710c4586

View File

@ -30,20 +30,23 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
ares_socket_t nfds; ares_socket_t nfds;
int i; int i;
/* No queries, no file descriptors. */
if (!channel->queries)
return 0;
nfds = 0; nfds = 0;
for (i = 0; i < channel->nservers; i++) for (i = 0; i < channel->nservers; i++)
{ {
server = &channel->servers[i]; server = &channel->servers[i];
if (server->udp_socket != ARES_SOCKET_BAD) /* We only need to register interest in UDP sockets if we have
* outstanding queries.
*/
if (channel->queries && server->udp_socket != ARES_SOCKET_BAD)
{ {
FD_SET(server->udp_socket, read_fds); FD_SET(server->udp_socket, read_fds);
if (server->udp_socket >= nfds) if (server->udp_socket >= nfds)
nfds = server->udp_socket + 1; nfds = server->udp_socket + 1;
} }
/* We always register for TCP events, because we want to know
* when the other side closes the connection, so we don't waste
* time trying to use a broken connection.
*/
if (server->tcp_socket != ARES_SOCKET_BAD) if (server->tcp_socket != ARES_SOCKET_BAD)
{ {
FD_SET(server->tcp_socket, read_fds); FD_SET(server->tcp_socket, read_fds);