TCP/IP based digital io controller for operating DigitalsOuts and reading DigitalIns.

Dependencies:   EthernetInterface NetworkAPI mbed-rtos mbed

Fork of NetRelais by Roy van Dam

Revision:
9:a4c85bea2d77
Parent:
8:d55cac25e637
Child:
10:22d49341340c
--- a/main.cpp	Wed Jul 18 11:24:12 2012 +0000
+++ b/main.cpp	Wed Jul 18 18:45:57 2012 +0000
@@ -1,8 +1,13 @@
 #include "mbed.h"
 #include "EthernetInterface.h"
 
+#include "NetworkAPI/buffer.hpp"
+#include "NetworkAPI/select.hpp"
 #include "NetworkAPI/ip/address.hpp"
-#include "NetworkAPI/udp/socket.hpp"
+#include "NetworkAPI/tcp/socket.hpp"
+using namespace network;
+
+#define MAX_CLIENTS 5
 
 int
 main()
@@ -11,43 +16,93 @@
     interface.init();
     interface.connect();
     printf("IP Address is %s\n\r", interface.getIPAddress());
-  
-    network::udp::Socket socket;
-    char buffer[1024];
+    
+    Select select;
+    tcp::Socket server;
+    tcp::Socket client[MAX_CLIENTS];
+    tcp::Socket *socket = NULL;
+    
     int result = 0;
+    int index = 0;
     
-    if (socket.open() < 0) {
-        printf("Failed to open UDP Socket\n\r");
-        return -1;
-    }
+    network::Buffer buffer(256);
+    std::string message("Hello world!");
     
-    if (socket.bind(42) < 0) {
-        printf("Failed to bind UDP Socket to port 42\n\r");
+    // Configure the server socket (assume everty thing works)
+    server.open();
+    server.bind(1234);
+    server.listen(MAX_CLIENTS);
+  
+    // Add sockets to the select api
+    select.set(&server, Select::Read);
+    for (index = 0; index < MAX_CLIENTS; index++) {
+        select.set(&client[index], Select::Read);
     }
     
-    while (true) {
-        result = socket.receive(buffer, 1024);
+    do {
+        // Wait for activity
+        result = select.wait();
+        if (result < -1) {
+            printf("Failed to select\n\r");
+            break;
+        }
+        
+        // Get the first socket
+        socket = (tcp::Socket *)select.getReadable();
         
-        switch (result) {
-            case -1:
-                printf("Failed to read from UDP Socket\n\r");
-                return -1;
-            
-            case 0:
-                printf("Nothing received...?\n\r");
-                continue;
+        for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) {
+            // Check if there was a connection request.
+            if (socket->getHandle() == server.getHandle()) {                
+                // Find an unused client
+                for (index = 0; index < MAX_CLIENTS; index++) {
+                    if (client[index].getStatus() == Socket::Closed) {
+                        break;
+                    }
+                }
+                
+                // Maximum connections reached
+                if (index == MAX_CLIENTS) {
+                    printf("Maximum connections reached\n\r");
+                    continue;
+                }
             
-            default:
-                printf("Received %d bytes from %s:%d\n\r", result,
-                    socket.getRemoteEndpoint().getAddress().toString().c_str(),
-                    socket.getRemoteEndpoint().getPort());
+                // Accept the client
+                socket->accept(client[index]);
+                printf("Client connected %s:%d\n\r",
+                    client[index].getRemoteEndpoint().getAddress().toString().c_str(),
+                    client[index].getRemoteEndpoint().getPort());
+                    
+                // Send a nice message to the client
+                client[index].write((void *)message.data(), message.size());
+                continue;
+            }
+            
+            // It was not the server socket, so it must be a client talking to us.
+            switch (socket->read(buffer)) {
+                case 0:
+                    // Remote end disconnected
+                    printf("Client disconnected %s:%d\n\r",
+                        socket->getRemoteEndpoint().getAddress().toString().c_str(),
+                        socket->getRemoteEndpoint().getPort());
+                    
+                    // Close socket
+                    socket->close();
+                    break;
                 
-                if (!socket.getRemoteEndpoint().getAddress().isEmpty()) {
-                    socket.send(buffer, result, socket.getRemoteEndpoint());
-                }
-                continue;
-       }
-    }
-        
-    return 0;
+                case -1:
+                    printf("Error while reading data from socket\n\r");
+                    socket->close();
+                    break;
+                
+                default:
+                    printf("Message from %s:%d\n\r",
+                        socket->getRemoteEndpoint().getAddress().toString().c_str(),
+                        socket->getRemoteEndpoint().getPort());
+                        
+                    printf("%s\n\r", (char *)buffer.pointer());
+                    break;
+            }
+        }
+            
+    } while (server.getStatus() == Socket::Listening);
 }
\ No newline at end of file