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

Files at this revision

API Documentation at this revision

Comitter:
NegativeBlack
Date:
Wed Jul 18 18:45:57 2012 +0000
Parent:
8:d55cac25e637
Child:
10:22d49341340c
Commit message:
TCP Server Example

Changed in this revision

NetworkAPI.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/NetworkAPI.lib	Wed Jul 18 11:24:12 2012 +0000
+++ b/NetworkAPI.lib	Wed Jul 18 18:45:57 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/NegativeBlack/code/NetworkAPI/#d30db8752485
+http://mbed.org/users/NegativeBlack/code/NetworkAPI/#847a0b218e22
--- 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