EthernetInterface, TCP Echo Server, support multi session

Dependencies:   EthernetInterface mbed-rtos mbed

Fork of TCPEchoServer by mbed official

mbed RTOS により、マルチセッションに対応した TCP Echo Server です。

複数のTCP接続を受付け、処理することができます。

accept の後に fork (スレッドを生成)しています。

Files at this revision

API Documentation at this revision

Comitter:
okini3939
Date:
Thu Nov 07 01:44:20 2013 +0000
Parent:
7:0a3cf89d5b93
Commit message:
re-use thread

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 0a3cf89d5b93 -r 46437b951a2f main.cpp
--- a/main.cpp	Fri Nov 01 05:35:31 2013 +0000
+++ b/main.cpp	Thu Nov 07 01:44:20 2013 +0000
@@ -4,36 +4,54 @@
 
 #define ECHO_SERVER_PORT   10000
 
-#define THREAD_MAX 10
+#define THREAD_MAX 5
 Thread *threads[THREAD_MAX];
+Thread *xthread;
 
 void child (void const *arg) {
     int i;
     char buf[256];
     TCPSocketConnection *client = (TCPSocketConnection*)arg;
 
-    printf("Connection from %s\r\n", client->get_address());
-//    client->set_blocking(false, 1500); // Timeout after (1.5)s
     for (;;) {
-        i = client->receive(buf, sizeof(buf));
-        if (i < 0) break;
-        if (i == 0) continue;
-        buf[i] = 0;
-        printf("Recv '%s'\r\n", buf);
-        if (client->send(buf, i) < 0) break;
+        printf("Connection from %s\r\n", client->get_address());
+//        client->set_blocking(false, 1500); // Timeout after (1.5)s
+        for (;;) {
+            i = client->receive(buf, sizeof(buf));
+            if (i < 0) break;
+            if (i == 0) continue;
+            buf[i] = 0;
+            printf("Recv '%s'\r\n", buf);
+            if (client->send(buf, i) < 0) break;
+        }
+
+        client->close();
+        printf("Close %s\r\n", client->get_address());
+
+        Thread::signal_wait(1);
     }
+}
 
-    client->close();
-    printf("Close %s\r\n", client->get_address());
+void closer (void const *arg) {
+    TCPSocketConnection *client = (TCPSocketConnection*)arg;
+
+    for (;;) {
+        client->close();
+        printf("Close %s\r\n", client->get_address());
+
+        Thread::signal_wait(1);
+    }
 }
 
 void parent () {
     int i, t = 0;
-    TCPSocketConnection *client;
+    TCPSocketConnection clients[THREAD_MAX];
+    TCPSocketConnection xclient;
 
     for (i = 0; i < THREAD_MAX; i ++) {
         threads[i] = NULL;
     }
+    xthread = NULL;
 
     TCPSocketServer server;
     server.bind(ECHO_SERVER_PORT);
@@ -42,15 +60,28 @@
     printf("Wait for new connection...\r\n");
     for (;;) {
         if (t >= 0) {
-            client = new TCPSocketConnection;
-            server.accept(*client);
+            server.accept(clients[t]);
             // fork child process
-            threads[t] = new Thread(child, (void*)client);
+            if (threads[t]) {
+                threads[t]->signal_set(1);
+            } else {
+                threads[t] = new Thread(child, (void*)&clients[t]);
+            }
             printf("Forked %d\r\n", t);
+        } else {
+            server.accept(xclient);
+            // closer process
+            if (xthread) {
+                xthread->signal_set(1);
+            } else {
+                xthread = new Thread(closer, (void*)&xclient);
+            }
+            printf("Connection full\r\n");
         }
-        
+
         t = -1;
         for (i = 0; i < THREAD_MAX; i ++) {
+/*
             if (threads[i]) {
                 if (threads[i]->get_state() == Thread::Inactive) {
                     // terminate process
@@ -59,8 +90,9 @@
                     printf("Terminated %d\r\n", i);
                 }
             }
-            if (threads[i] == NULL) {
-                if (t < 0) t = i; // empty thread
+*/
+            if (threads[i] == NULL || threads[i]->get_state() == Thread::WaitingAnd) {
+                if (t < 0) t = i; // next empty thread
             }
         }
     }
@@ -71,7 +103,7 @@
     EthernetInterface eth;
     printf("TCP Echo Server with Fork...\r\n");
     eth.init(); //Use DHCP
-    eth.connect();
+    if (eth.connect()) return -1;
     printf("IP Address is %s\r\n", eth.getIPAddress());
 
     parent();