static int     cfg_port        = 8000;
 static int     cfg_runtime_ms  = -1;
 static bool    cfg_poll;
+static int     cfg_poll_loop_timeout_ms = 2000;
 static bool    cfg_segment;
 static bool    cfg_sendmmsg;
 static bool    cfg_tcp;
        }
 }
 
-static void flush_errqueue(int fd, const bool do_poll)
+static void flush_errqueue(int fd, const bool do_poll,
+                          unsigned long poll_timeout, const bool poll_err)
 {
        if (do_poll) {
                struct pollfd fds = {0};
                int ret;
 
                fds.fd = fd;
-               ret = poll(&fds, 1, 500);
+               ret = poll(&fds, 1, poll_timeout);
                if (ret == 0) {
-                       if (cfg_verbose)
+                       if ((cfg_verbose) && (poll_err))
                                fprintf(stderr, "poll timeout\n");
                } else if (ret < 0) {
                        error(1, errno, "poll");
        flush_errqueue_recv(fd);
 }
 
+static void flush_errqueue_retry(int fd, unsigned long num_sends)
+{
+       unsigned long tnow, tstop;
+       bool first_try = true;
+
+       tnow = gettimeofday_ms();
+       tstop = tnow + cfg_poll_loop_timeout_ms;
+       do {
+               flush_errqueue(fd, true, tstop - tnow, first_try);
+               first_try = false;
+               tnow = gettimeofday_ms();
+       } while ((stat_zcopies != num_sends) && (tnow < tstop));
+}
+
 static int send_tcp(int fd, char *data)
 {
        int ret, done = 0, count = 0;
 
 static void usage(const char *filepath)
 {
-       error(1, 0, "Usage: %s [-46acmHPtTuvz] [-C cpu] [-D dst ip] [-l secs] [-M messagenr] [-p port] [-s sendsize] [-S gsosize]",
+       error(1, 0, "Usage: %s [-46acmHPtTuvz] [-C cpu] [-D dst ip] [-l secs] "
+                   "[-L secs] [-M messagenr] [-p port] [-s sendsize] [-S gsosize]",
                    filepath);
 }
 
        int max_len, hdrlen;
        int c;
 
-       while ((c = getopt(argc, argv, "46acC:D:Hl:mM:p:s:PS:tTuvz")) != -1) {
+       while ((c = getopt(argc, argv, "46acC:D:Hl:L:mM:p:s:PS:tTuvz")) != -1) {
                switch (c) {
                case '4':
                        if (cfg_family != PF_UNSPEC)
                case 'l':
                        cfg_runtime_ms = strtoul(optarg, NULL, 10) * 1000;
                        break;
+               case 'L':
+                       cfg_poll_loop_timeout_ms = strtoul(optarg, NULL, 10) * 1000;
+                       break;
                case 'm':
                        cfg_sendmmsg = true;
                        break;
                        num_sends += send_udp(fd, buf[i]);
                num_msgs++;
                if ((cfg_zerocopy && ((num_msgs & 0xF) == 0)) || cfg_tx_tstamp)
-                       flush_errqueue(fd, cfg_poll);
+                       flush_errqueue(fd, cfg_poll, 500, true);
 
                if (cfg_msg_nr && num_msgs >= cfg_msg_nr)
                        break;
        } while (!interrupted && (cfg_runtime_ms == -1 || tnow < tstop));
 
        if (cfg_zerocopy || cfg_tx_tstamp)
-               flush_errqueue(fd, true);
+               flush_errqueue_retry(fd, num_sends);
 
        if (close(fd))
                error(1, errno, "close");