diff --git a/netutils/iperf/iperf.c b/netutils/iperf/iperf.c
index 86b0faa9c..e56a0d26a 100644
--- a/netutils/iperf/iperf.c
+++ b/netutils/iperf/iperf.c
@@ -338,7 +338,20 @@ static int iperf_run_tcp_server(void)
       while (!s_iperf_ctrl.finish)
         {
           actual_recv = recv(sockfd, buffer, want_recv, 0);
-          if (actual_recv < 0)
+          if (actual_recv == 0)
+            {
+              printf("closed by the peer: %s,%d\n",
+                     inet_ntoa(remote_addr.sin_addr),
+                     htons(remote_addr.sin_port));
+
+              /* Note: unlike the original iperf, this implementation
+               * exits after finishing a single connection.
+               */
+
+              s_iperf_ctrl.finish = true;
+              break;
+            }
+          else if (actual_recv < 0)
             {
               iperf_show_socket_error_reason("tcp server recv",
                                              listen_socket);