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

Dependencies:   mbed mbed-rtos EthernetInterface NetworkAPI

Files at this revision

API Documentation at this revision

Comitter:
NegativeBlack
Date:
Thu Sep 27 09:35:46 2012 +0000
Parent:
9:a4c85bea2d77
Child:
11:90554d22ade5
Commit message:
Updated NetworkAPI library.

Changed in this revision

EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
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
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
--- a/EthernetInterface.lib	Wed Jul 18 18:45:57 2012 +0000
+++ b/EthernetInterface.lib	Thu Sep 27 09:35:46 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/EthernetInterface/#0063a5bac04f
+http://mbed.org/users/mbed_official/code/EthernetInterface/#a0ee3ae75cfa
--- a/NetworkAPI.lib	Wed Jul 18 18:45:57 2012 +0000
+++ b/NetworkAPI.lib	Thu Sep 27 09:35:46 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/NegativeBlack/code/NetworkAPI/#847a0b218e22
+http://mbed.org/users/NegativeBlack/code/NetworkAPI/#cdee0f2b6ff0
--- 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
--- a/mbed-rtos.lib	Wed Jul 18 18:45:57 2012 +0000
+++ b/mbed-rtos.lib	Thu Sep 27 09:35:46 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed-rtos/#01158bb7600c
+http://mbed.org/users/mbed_official/code/mbed-rtos/#9654a71f5a90