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); }