A new object oriented network api that can be used to replace the one provided by the EthernetInterface library.

Dependents:   NetRelais TCP_Client_Example TCP_Server_Example UDP_Server_Example ... more

tcp server example

Accept one connection at a time

#include "mbed.h"
#include "EthernetInterface.h"

#include "NetworkAPI/buffer.hpp"
#include "NetworkAPI/tcp/socket.hpp"
using namespace network;

#define PORT 1234
#define MAX_PENDING 1

int
main()
{
    EthernetInterface interface;
    interface.init();
    interface.connect();
    printf("IP Address is %s\n\r", interface.getIPAddress());
    
    tcp::Socket server;
    tcp::Socket client;

    Buffer buffer(256);
    
    if (server.open() < 0) {
        printf("Could not open server socket.\n\r");
        return -1;
    }
    
    if (server.bind(PORT) < 0) {
        printf("Could not bind server socket to port '%d'.\n\r", PORT);
        return -1;
    }
    
    if (server.listen(MAX_PENDING) < 0) {
        printf("Could not put server socket into listening mode.\n\r");
        return -1;
    }

    while (server.getStatus() == Socket::Listening) {
        if (server.accept(client) < 0) {
            printf("Warning: failed to accept connection.\n\r");
            continue;
        }
                        
        printf("Client connected '%s:%d'.\n\r",
            client.getRemoteEndpoint().getAddress().toString().c_str(),
            client.getRemoteEndpoint().getPort());
        
        while (client.getStatus() == tcp::Socket::Connected) {
            buffer.flush();
            
            switch (client.read(buffer)) {
                case -1:
                    printf("Warning: failed to read data from client.\n\r");
                    break;
                
                case 0:
                    printf("Connection closed.\n\r");
                    break;
                
                default:
                    printf("Received %d bytes.\n\r%s\r", buffer.length(), (char *)buffer.data());
                    continue;
            }
            
            client.shutdown();
            client.close();
        }
    }
}

Accept multiple connections using the select class

#include "mbed.h"
#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
 
int
main()
{
    EthernetInterface interface;
    interface.init();
    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;
     
    network::Buffer buffer(256);
    std::string message("Hello world!");
     
    // 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);
    }
     
    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();
         
        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() == network::Socket::Closed) {
                        break;
                    }
                }
                 
                // Maximum connections reached
                if (index == MAX_CLIENTS) {
                    printf("Maximum connections reached\n\r");
                    continue;
                }
             
                // 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;
                 
                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.data());
                    break;
            }
        }
             
    } while (server.getStatus() == network::Socket::Listening);
}

All wikipages