Browse Source

Avoid a level of imbrication in bandwidth-server-many-up

Stéphane Raimbault 12 years ago
parent
commit
ef81a69e7b
2 changed files with 43 additions and 44 deletions
  1. 42 43
      tests/bandwidth-server-many-up.c
  2. 1 1
      tests/unit-test-client.c

+ 42 - 43
tests/bandwidth-server-many-up.c

@@ -49,11 +49,11 @@ static void close_sigint(int dummy)
 
 int main(void)
 {
+    uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
     int master_socket;
     int rc;
     fd_set refset;
     fd_set rdset;
-
     /* Maximum file descriptor number */
     int fdmax;
 
@@ -91,49 +91,48 @@ int main(void)
          * read */
         for (master_socket = 0; master_socket <= fdmax; master_socket++) {
 
-            if (FD_ISSET(master_socket, &rdset)) {
-                if (master_socket == server_socket) {
-                    /* A client is asking a new connection */
-                    socklen_t addrlen;
-                    struct sockaddr_in clientaddr;
-                    int newfd;
-
-                    /* Handle new connections */
-                    addrlen = sizeof(clientaddr);
-                    memset(&clientaddr, 0, sizeof(clientaddr));
-                    newfd = accept(server_socket, (struct sockaddr *)&clientaddr, &addrlen);
-                    if (newfd == -1) {
-                        perror("Server accept() error");
-                    } else {
-                        FD_SET(newfd, &refset);
-
-                        if (newfd > fdmax) {
-                            /* Keep track of the maximum */
-                            fdmax = newfd;
-                        }
-                        printf("New connection from %s:%d on socket %d\n",
-                               inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port, newfd);
-                    }
+            if (!FD_ISSET(master_socket, &rdset)) {
+                continue;
+            }
+
+            if (master_socket == server_socket) {
+                /* A client is asking a new connection */
+                socklen_t addrlen;
+                struct sockaddr_in clientaddr;
+                int newfd;
+
+                /* Handle new connections */
+                addrlen = sizeof(clientaddr);
+                memset(&clientaddr, 0, sizeof(clientaddr));
+                newfd = accept(server_socket, (struct sockaddr *)&clientaddr, &addrlen);
+                if (newfd == -1) {
+                    perror("Server accept() error");
                 } else {
-                    /* An already connected master has sent a new query */
-                    uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
-
-                    modbus_set_socket(ctx, master_socket);
-                    rc = modbus_receive(ctx, query);
-                    if (rc > 0) {
-                        modbus_reply(ctx, query, rc, mb_mapping);
-                    } else if (rc == -1) {
-                        /* This example server in ended on connection closing or
-                         * any errors. */
-                        printf("Connection closed on socket %d\n", master_socket);
-                        close(master_socket);
-
-                        /* Remove from reference set */
-                        FD_CLR(master_socket, &refset);
-
-                        if (master_socket == fdmax) {
-                            fdmax--;
-                        }
+                    FD_SET(newfd, &refset);
+
+                    if (newfd > fdmax) {
+                        /* Keep track of the maximum */
+                        fdmax = newfd;
+                    }
+                    printf("New connection from %s:%d on socket %d\n",
+                           inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port, newfd);
+                }
+            } else {
+                modbus_set_socket(ctx, master_socket);
+                rc = modbus_receive(ctx, query);
+                if (rc > 0) {
+                    modbus_reply(ctx, query, rc, mb_mapping);
+                } else if (rc == -1) {
+                    /* This example server in ended on connection closing or
+                     * any errors. */
+                    printf("Connection closed on socket %d\n", master_socket);
+                    close(master_socket);
+
+                    /* Remove from reference set */
+                    FD_CLR(master_socket, &refset);
+
+                    if (master_socket == fdmax) {
+                        fdmax--;
                     }
                 }
             }

+ 1 - 1
tests/unit-test-client.c

@@ -49,7 +49,7 @@ int main(int argc, char *argv[])
     if (argc > 1) {
         if (strcmp(argv[1], "tcp") == 0) {
             use_backend = TCP;
-    } else if (strcmp(argv[1], "tcppi") == 0) {
+        } else if (strcmp(argv[1], "tcppi") == 0) {
             use_backend = TCP_PI;
         } else if (strcmp(argv[1], "rtu") == 0) {
             use_backend = RTU;