SimpleSocket 1.0 examples

Dependencies:   EthernetNetIf SimpleSocket 1.0 mbed

Revision:
2:304672a01127
Parent:
1:7350a2598a80
Child:
3:464dd710e6f6
--- a/main.cpp	Tue Aug 16 02:50:52 2011 +0000
+++ b/main.cpp	Tue Aug 16 06:56:48 2011 +0000
@@ -3,82 +3,136 @@
 #include "TCPSocket.h"
 #include "SocketUtil.h"
 
-EthernetNetIf eth;
-DigitalOut led1(LED1);
+class ClientSocket {
+public:
+    ClientSocket(TCPSocket *socket) : socket(socket) {
+        socket->setOnEvent(this, &ClientSocket::onClientSocketEvent);
+    }
+
+    bool connected() {
+        if (socket)
+            Net::poll();
+        return socket != 0;
+    }
+
+    void onClientSocketEvent(TCPSocketEvent e) {
+        SocketEvent event = e;
+        printf(event);
 
-TCPSocket tcp;   //The listening port where requests are queued
-TCPSocket* link; //The port where accepted requests can communicate
-Host local(IpAddr(), 1234); // mbed
-Host client;
+        switch (event) {
+            case TCPSOCKET_READABLE:
+                char buf[128];
+                while (int len = socket->recv(buf, 128)) {
+                    // And send straight back out again
+                    socket->send(buf, len);
+                    buf[len] = 0; // make terminater
+                    printf("Received & Wrote: %s\n",buf);
+                }
+                break;
+            case TCPSOCKET_DISCONNECTED:
+                socket->close();
+                delete socket;
+                socket = 0;
+                break;
+        }
+    }
+
+private:
+    TCPSocket *socket;
+};
+
+class ServerSocket {
+public:
+    ServerSocket(int port) : port(port), ssocketAcceptEvent(false) {}
+
+    void init() {
+        EthernetNetIf eth;
+        EthernetErr ethErr = eth.setup();
+        if (ethErr) error("Error %d in setup.\n", ethErr);
 
-void onLinkSocketEvent(TCPSocketEvent e) {
-    SocketEvent event = e;
-    printf(event);
+        ssocket.setOnEvent(this, &ServerSocket::onTCPSocketEvent);
+
+        SocketError bindErr = ssocket.bind(Host(IpAddr(), port));
+        printf("Init bind... %s", bindErr.toString());
+
+        SocketError listenErr = ssocket.listen();
+        printf("Init listen... %s", listenErr.toString());
+    }
+
+
+    void onTCPSocketEvent(TCPSocketEvent e) {
+        SocketEvent event = e;
+        printf(event);
 
-    switch (event) {
-        case TCPSOCKET_READABLE:
-            char buf[128];
-            while (int len = link->recv(buf, 128)) {
-                // And send straight back out again
-                link->send(buf, len);
-                buf[len] = 0; // make terminater
-                printf("Received & Wrote: %s\n",buf);
+        switch (event) {
+            case TCPSOCKET_ACCEPT:
+                ssocketAcceptEvent = true;
+                //if (SocketError err = ssocket.accept(&client, &link)) {
+                //    printf("accept:%s", err.toString());
+                //} else {
+                //    link->setOnEvent(this, &ServerSocket::onLinkSocketEvent);
+                //    IpAddr ip = client.getIp();
+                //    printf("Incoming TCP connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
+                //}
+                break;
+
+            case TCPSOCKET_DISCONNECTED:
+                ssocket.close();
+                break;
+        }
+    }
+
+    ClientSocket *accept() {
+        Net::poll();
+
+        if (ssocketAcceptEvent) {
+            ssocketAcceptEvent = false;
+            TCPSocket* socket;
+            Host host;
+            SocketError err = ssocket.accept(&host, &socket);
+
+            if (!err) {
+                ClientSocket *clientSocket = new ClientSocket(socket);
+                IpAddr ip = host.getIp();
+                printf("TCP connection from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
+                return clientSocket;
+            } else {
+                printf("accept:%s", err.toString());
             }
-            break;
-        case TCPSOCKET_DISCONNECTED:
-            link->close();
-            break;
+        }
+
+        return NULL;
     }
-}
-
-void onTCPSocketEvent(TCPSocketEvent e) {
-    SocketEvent event = e;
-    printf(event);
 
-    switch (event) {
-        case TCPSOCKET_ACCEPT:
-            if (SocketError err = tcp.accept(&client, &link)) {
-                printf(err);
-            } else {
-                link->setOnEvent(&onLinkSocketEvent);
-                IpAddr ip = client.getIp();
-                printf("Incoming TCP connection from %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]);
-            }
-            break;
-
-        case TCPSOCKET_DISCONNECTED:
-            tcp.close();
-            break;
-    }
-}
+private:
+    int port;
+    TCPSocket ssocket;   //The listening port where requests are queued
+    bool ssocketAcceptEvent;
+};
 
 int main() {
-    //Basic setup
-    printf("Welcome to wireFUSE\n");
-    printf("Setting up...\n");
-    EthernetErr ethErr = eth.setup();
-    if (ethErr)
-        error("Error %d in setup.\n", ethErr);
-    printf("Setup OK\n");
-
-    tcp.setOnEvent(&onTCPSocketEvent);
-
-    //Bind to local port
-    SocketError bindErr = tcp.bind(local);
-    printf("Init bind... %s", (char *) bindErr);
-
-    //Listen to local port
-    TCPSocketErr listenErr = tcp.listen();
-    printf("Init listen... %s", (char *)listenErr);
-    
+    DigitalOut led1(LED1);
+    DigitalOut led2(LED2);
+    ServerSocket server(1234);
+    server.init();
     Timer timer;
     timer.start();
+
     while (true) {
-        Net::poll();
-        if (timer.read() > 10) {
+    Net::poll();
+        if (ClientSocket *clientSocket = server.accept()) {
+            while (clientSocket->connected()) {
+                if (timer.read() > 10) {
+                    timer.reset();
+                    timer.start();
+                    led1 = !led1;
+                }
+            }
+        }
+        if (timer.read() > 1) {
             timer.reset();
-            led1 = !led1; //Show that we are alive
-            printf("waiting for client on port 1234\n");
+            timer.start();
+            led2 = !led2;
         }
     }
 }
\ No newline at end of file