tests: Modify echo server to accept multiple connections
authorAnoop C S <anoopcs@redhat.com>
Thu, 2 Mar 2017 07:12:50 +0000 (07:12 +0000)
committerAndreas Schneider <asn@samba.org>
Wed, 2 May 2018 14:31:42 +0000 (16:31 +0200)
In context of multiple threads, echo server must be capable of
accepting connections in a loop rather than be satisfied with
one incoming connection.

Signed-off-by: Anoop C S <anoopcs@redhat.com>
Reviewed-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
tests/echo_srv.c

index 5b784de1d1e6c5aee387960c3a20afc59771389b..2f877f4e24f7f1914aa2c309dcca79e5ce1f386a 100644 (file)
@@ -497,39 +497,51 @@ static void echo_tcp(int sock)
 
     int client_sock = -1;
     int s;
+    pid_t pid;
 
-    s = accept(sock, &addr.sa.s, &addr.sa_socklen);
-    if (s == -1) {
-        perror("accept");
-       goto done;
-    }
-
-    client_sock = socket_dup(s);
-    if (client_sock == -1) {
-        perror("socket_dup");
-       goto done;
-    }
-
-    /* Start ping pong */
     while (1) {
-        bret = recv(client_sock, buf, BUFSIZE, 0);
-        if (bret == -1) {
-            perror("recv");
+        s = accept(sock, &addr.sa.s, &addr.sa_socklen);
+        if (s == -1) {
+            perror("accept");
             goto done;
-        } else if (bret == 0) {
-            break;
         }
 
-        bret = send(client_sock, buf, bret, 0);
-        if (bret == -1) {
-            perror("send");
-            goto done;
+        pid = fork();
+        if (pid == -1) {
+            perror("fork");
+        } else if (pid == 0) {
+            close(sock);
+            client_sock = socket_dup(s);
+            if (client_sock == -1) {
+                perror("socket_dup");
+                goto done;
+            }
+
+            while (1) {
+                bret = recv(client_sock, buf, BUFSIZE, 0);
+                if (bret == -1) {
+                    perror("recv");
+                    goto done;
+                } else if (bret == 0) {
+                    break;
+                }
+
+                bret = send(client_sock, buf, bret, 0);
+                if (bret == -1) {
+                    perror("send");
+                    goto done;
+                }
+            }
+            close(s);
+            exit(0);
+        } else {
+            close(s);
         }
     }
 
 done:
     if (client_sock != -1) {
-           close(client_sock);
+        close(client_sock);
     }
 }