Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: NetRelais TCP_Client_Example TCP_Server_Example UDP_Server_Example ... more
You are viewing an older revision! See the latest version
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() == 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.pointer());
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() == 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.pointer());
break;
}
}
} while (server.getStatus() == Socket::Listening);
}