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.
Dependencies: EthernetInterface NetworkAPI SDC21XX_Motor mbed-rtos mbed
Fork of TCP_Server_Example by
Diff: main.cpp
- Revision:
- 11:90554d22ade5
- Parent:
- 10:9e8d5928537a
- Child:
- 12:5e342c364d61
--- a/main.cpp Thu Sep 27 09:35:46 2012 +0000
+++ b/main.cpp Sat Nov 15 21:46:59 2014 +0000
@@ -1,13 +1,14 @@
#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 PORT 1234
-#define MAX_PENDING 1
-
+
+#define MAX_CLIENTS 5
+
int
main()
{
@@ -15,56 +16,93 @@
interface.init();
interface.connect();
printf("IP Address is %s\n\r", interface.getIPAddress());
-
+
+ Select select;
tcp::Socket server;
- tcp::Socket client;
-
- Buffer buffer(256);
-
- if (server.open() < 0) {
- printf("Could not open server socket.\n\r");
- return -1;
+ 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);
}
-
- 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() == tcp::Socket::Listening) {
- if (server.accept(client) < 0) {
- printf("Warning: failed to accept connection.\n\r");
- continue;
+
+ do {
+ // Wait for activity
+ result = select.wait();
+ if (result < -1) {
+ printf("Failed to select\n\r");
+ break;
}
-
- 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;
-
+
+ // 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:
- printf("Connection closed.\n\r");
+ // 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("Received %d bytes.\n\r%s\r", buffer.length(), (char *)buffer.data());
- continue;
+ printf("Message from %s:%d\n\r",
+ socket->getRemoteEndpoint().getAddress().toString().c_str(),
+ socket->getRemoteEndpoint().getPort());
+
+ printf("%s\n\r", (char *)buffer.data());
+ break;
}
-
- client.shutdown();
- client.close();
}
- }
+
+ } while (server.getStatus() == network::Socket::Listening);
}
\ No newline at end of file
