--- /dev/null
+diff --git a/src/liboping.c b/src/liboping.c
+index 411d866..e80ea29 100644
+--- a/src/liboping.c
++++ b/src/liboping.c
+@@ -590,9 +590,10 @@ static int ping_receive_one (pingobj_t *obj, const pinghost_t *ph,
+
+ static int ping_receive_all (pingobj_t *obj)
+ {
+- fd_set readfds;
+- int num_readfds;
+- int max_readfds;
++ fd_set read_fds;
++ fd_set err_fds;
++ int num_fds;
++ int max_fd;
+
+ pinghost_t *ph;
+ pinghost_t *ptr;
+@@ -631,23 +632,25 @@ static int ping_receive_all (pingobj_t *obj)
+
+ while (1)
+ {
+- FD_ZERO (&readfds);
+- num_readfds = 0;
+- max_readfds = -1;
++ FD_ZERO (&read_fds);
++ FD_ZERO (&err_fds);
++ num_fds = 0;
++ max_fd = -1;
+
+ for (ptr = ph; ptr != NULL; ptr = ptr->next)
+ {
+ if (!timerisset (ptr->timer))
+ continue;
+
+- FD_SET (ptr->fd, &readfds);
+- num_readfds++;
++ FD_SET (ptr->fd, &read_fds);
++ FD_SET (ptr->fd, &err_fds);
++ num_fds++;
+
+- if (max_readfds < ptr->fd)
+- max_readfds = ptr->fd;
++ if (max_fd < ptr->fd)
++ max_fd = ptr->fd;
+ }
+
+- if (num_readfds == 0)
++ if (num_fds == 0)
+ break;
+
+ if (gettimeofday (&nowtime, NULL) == -1)
+@@ -659,11 +662,11 @@ static int ping_receive_all (pingobj_t *obj)
+ if (ping_timeval_sub (&endtime, &nowtime, &timeout) == -1)
+ break;
+
+- dprintf ("Waiting on %i sockets for %i.%06i seconds\n", num_readfds,
++ dprintf ("Waiting on %i sockets for %i.%06i seconds\n", num_fds,
+ (int) timeout.tv_sec,
+ (int) timeout.tv_usec);
+
+- status = select (max_readfds + 1, &readfds, NULL, NULL, &timeout);
++ status = select (max_fd + 1, &read_fds, NULL, &err_fds, &timeout);
+
+ if (gettimeofday (&nowtime, NULL) == -1)
+ {
+@@ -696,9 +699,18 @@ static int ping_receive_all (pingobj_t *obj)
+
+ for (ptr = ph; ptr != NULL; ptr = ptr->next)
+ {
+- if (FD_ISSET (ptr->fd, &readfds))
++ if (FD_ISSET (ptr->fd, &read_fds))
++ {
+ if (ping_receive_one (obj, ptr, &nowtime) == 0)
+ ret++;
++ }
++ else if (FD_ISSET (ptr->fd, &err_fds))
++ {
++ /* clear the timer in this case so that we
++ * don't run into an endless loop. */
++ /* TODO: Set an error flag in this case. */
++ timerclear (ptr->timer);
++ }
+ }
+ } /* while (1) */
+