Example application that implements a simple TCP server on top of the NetworkAPI

Dependencies:   mbed mbed-rtos EthernetInterface NetworkAPI

Revision:
10:9e8d5928537a
Parent:
9:a4c85bea2d77
Child:
11:90554d22ade5
--- a/main.cpp	Wed Jul 18 18:45:57 2012 +0000
+++ b/main.cpp	Thu Sep 27 09:35:46 2012 +0000
@@ -2,12 +2,11 @@
 #include "EthernetInterface.h"
 
 #include "NetworkAPI/buffer.hpp"
-#include "NetworkAPI/select.hpp"
-#include "NetworkAPI/ip/address.hpp"
 #include "NetworkAPI/tcp/socket.hpp"
 using namespace network;
 
-#define MAX_CLIENTS 5
+#define PORT 1234
+#define MAX_PENDING 1
 
 int
 main()
@@ -17,92 +16,55 @@
     interface.connect();
     printf("IP Address is %s\n\r", interface.getIPAddress());
     
-    Select select;
     tcp::Socket server;
-    tcp::Socket client[MAX_CLIENTS];
-    tcp::Socket *socket = NULL;
-    
-    int result = 0;
-    int index = 0;
+    tcp::Socket client;
+
+    Buffer buffer(256);
     
-    network::Buffer buffer(256);
-    std::string message("Hello world!");
+    if (server.open() < 0) {
+        printf("Could not open server socket.\n\r");
+        return -1;
+    }
     
-    // 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);
+    if (server.bind(PORT) < 0) {
+        printf("Could not bind server socket to port '%d'.\n\r", PORT);
+        return -1;
     }
     
-    do {
-        // Wait for activity
-        result = select.wait();
-        if (result < -1) {
-            printf("Failed to select\n\r");
-            break;
+    if (server.listen(MAX_PENDING) < 0) {
+        printf("Could not put server socket into listening mode.\n\r");
+        return -1;
+    }
+
+    while (server.getStatus() == tcp::Socket::Listening) {
+        if (server.accept(client) < 0) {
+            printf("Warning: failed to accept connection.\n\r");
+            continue;
         }
-        
-        // Get the first socket
-        socket = (tcp::Socket *)select.getReadable();
+                        
+        printf("Client connected '%s:%d'.\n\r",
+            client.getRemoteEndpoint().getAddress().toString().c_str(),
+            client.getRemoteEndpoint().getPort());
         
-        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;
-                }
+        while (client.getStatus() == tcp::Socket::Connected) {
+            buffer.flush();
             
-                // 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();
+            switch (client.read(buffer)) {
+                case -1:
+                    printf("Warning: failed to read data from client.\n\r");
                     break;
                 
-                case -1:
-                    printf("Error while reading data from socket\n\r");
-                    socket->close();
+                case 0:
+                    printf("Connection closed.\n\r");
                     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;
+                    printf("Received %d bytes.\n\r%s\r", buffer.length(), (char *)buffer.data());
+                    continue;
             }
+            
+            client.shutdown();
+            client.close();
         }
-            
-    } while (server.getStatus() == Socket::Listening);
+    }
 }
\ No newline at end of file