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 (スレッドを生成)しています。

Committer:
okini3939
Date:
Fri Nov 01 05:35:31 2013 +0000
Revision:
7:0a3cf89d5b93
Parent:
3:36fd3cfad85a
Child:
8:46437b951a2f
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:38cbb854d85f 1 #include "mbed.h"
okini3939 7:0a3cf89d5b93 2 #include "rtos.h"
emilmont 1:5cebe0e38cd2 3 #include "EthernetInterface.h"
emilmont 1:5cebe0e38cd2 4
okini3939 7:0a3cf89d5b93 5 #define ECHO_SERVER_PORT 10000
okini3939 7:0a3cf89d5b93 6
okini3939 7:0a3cf89d5b93 7 #define THREAD_MAX 10
okini3939 7:0a3cf89d5b93 8 Thread *threads[THREAD_MAX];
okini3939 7:0a3cf89d5b93 9
okini3939 7:0a3cf89d5b93 10 void child (void const *arg) {
okini3939 7:0a3cf89d5b93 11 int i;
okini3939 7:0a3cf89d5b93 12 char buf[256];
okini3939 7:0a3cf89d5b93 13 TCPSocketConnection *client = (TCPSocketConnection*)arg;
emilmont 3:36fd3cfad85a 14
okini3939 7:0a3cf89d5b93 15 printf("Connection from %s\r\n", client->get_address());
okini3939 7:0a3cf89d5b93 16 // client->set_blocking(false, 1500); // Timeout after (1.5)s
okini3939 7:0a3cf89d5b93 17 for (;;) {
okini3939 7:0a3cf89d5b93 18 i = client->receive(buf, sizeof(buf));
okini3939 7:0a3cf89d5b93 19 if (i < 0) break;
okini3939 7:0a3cf89d5b93 20 if (i == 0) continue;
okini3939 7:0a3cf89d5b93 21 buf[i] = 0;
okini3939 7:0a3cf89d5b93 22 printf("Recv '%s'\r\n", buf);
okini3939 7:0a3cf89d5b93 23 if (client->send(buf, i) < 0) break;
okini3939 7:0a3cf89d5b93 24 }
okini3939 7:0a3cf89d5b93 25
okini3939 7:0a3cf89d5b93 26 client->close();
okini3939 7:0a3cf89d5b93 27 printf("Close %s\r\n", client->get_address());
okini3939 7:0a3cf89d5b93 28 }
okini3939 7:0a3cf89d5b93 29
okini3939 7:0a3cf89d5b93 30 void parent () {
okini3939 7:0a3cf89d5b93 31 int i, t = 0;
okini3939 7:0a3cf89d5b93 32 TCPSocketConnection *client;
okini3939 7:0a3cf89d5b93 33
okini3939 7:0a3cf89d5b93 34 for (i = 0; i < THREAD_MAX; i ++) {
okini3939 7:0a3cf89d5b93 35 threads[i] = NULL;
okini3939 7:0a3cf89d5b93 36 }
okini3939 7:0a3cf89d5b93 37
emilmont 1:5cebe0e38cd2 38 TCPSocketServer server;
emilmont 3:36fd3cfad85a 39 server.bind(ECHO_SERVER_PORT);
emilmont 3:36fd3cfad85a 40 server.listen();
okini3939 7:0a3cf89d5b93 41
okini3939 7:0a3cf89d5b93 42 printf("Wait for new connection...\r\n");
okini3939 7:0a3cf89d5b93 43 for (;;) {
okini3939 7:0a3cf89d5b93 44 if (t >= 0) {
okini3939 7:0a3cf89d5b93 45 client = new TCPSocketConnection;
okini3939 7:0a3cf89d5b93 46 server.accept(*client);
okini3939 7:0a3cf89d5b93 47 // fork child process
okini3939 7:0a3cf89d5b93 48 threads[t] = new Thread(child, (void*)client);
okini3939 7:0a3cf89d5b93 49 printf("Forked %d\r\n", t);
emilmont 1:5cebe0e38cd2 50 }
emilmont 3:36fd3cfad85a 51
okini3939 7:0a3cf89d5b93 52 t = -1;
okini3939 7:0a3cf89d5b93 53 for (i = 0; i < THREAD_MAX; i ++) {
okini3939 7:0a3cf89d5b93 54 if (threads[i]) {
okini3939 7:0a3cf89d5b93 55 if (threads[i]->get_state() == Thread::Inactive) {
okini3939 7:0a3cf89d5b93 56 // terminate process
okini3939 7:0a3cf89d5b93 57 // delete threads[i];
okini3939 7:0a3cf89d5b93 58 // threads[i] = NULL;
okini3939 7:0a3cf89d5b93 59 printf("Terminated %d\r\n", i);
okini3939 7:0a3cf89d5b93 60 }
okini3939 7:0a3cf89d5b93 61 }
okini3939 7:0a3cf89d5b93 62 if (threads[i] == NULL) {
okini3939 7:0a3cf89d5b93 63 if (t < 0) t = i; // empty thread
okini3939 7:0a3cf89d5b93 64 }
okini3939 7:0a3cf89d5b93 65 }
emilmont 1:5cebe0e38cd2 66 }
emilmont 1:5cebe0e38cd2 67 }
okini3939 7:0a3cf89d5b93 68
okini3939 7:0a3cf89d5b93 69
okini3939 7:0a3cf89d5b93 70 int main () {
okini3939 7:0a3cf89d5b93 71 EthernetInterface eth;
okini3939 7:0a3cf89d5b93 72 printf("TCP Echo Server with Fork...\r\n");
okini3939 7:0a3cf89d5b93 73 eth.init(); //Use DHCP
okini3939 7:0a3cf89d5b93 74 eth.connect();
okini3939 7:0a3cf89d5b93 75 printf("IP Address is %s\r\n", eth.getIPAddress());
okini3939 7:0a3cf89d5b93 76
okini3939 7:0a3cf89d5b93 77 parent();
okini3939 7:0a3cf89d5b93 78 }