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: mbed mbed-rtos EthernetInterface NetworkAPI
Diff: main.cpp
- Revision:
- 9:a4c85bea2d77
- Parent:
- 8:d55cac25e637
- Child:
- 10:9e8d5928537a
--- a/main.cpp Wed Jul 18 11:24:12 2012 +0000
+++ b/main.cpp Wed Jul 18 18:45:57 2012 +0000
@@ -1,8 +1,13 @@
#include "mbed.h"
#include "EthernetInterface.h"
+#include "NetworkAPI/buffer.hpp"
+#include "NetworkAPI/select.hpp"
#include "NetworkAPI/ip/address.hpp"
-#include "NetworkAPI/udp/socket.hpp"
+#include "NetworkAPI/tcp/socket.hpp"
+using namespace network;
+
+#define MAX_CLIENTS 5
int
main()
@@ -11,43 +16,93 @@
interface.init();
interface.connect();
printf("IP Address is %s\n\r", interface.getIPAddress());
-
- network::udp::Socket socket;
- char buffer[1024];
+
+ Select select;
+ tcp::Socket server;
+ tcp::Socket client[MAX_CLIENTS];
+ tcp::Socket *socket = NULL;
+
int result = 0;
+ int index = 0;
- if (socket.open() < 0) {
- printf("Failed to open UDP Socket\n\r");
- return -1;
- }
+ network::Buffer buffer(256);
+ std::string message("Hello world!");
- if (socket.bind(42) < 0) {
- printf("Failed to bind UDP Socket to port 42\n\r");
+ // 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);
}
- while (true) {
- result = socket.receive(buffer, 1024);
+ 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();
- switch (result) {
- case -1:
- printf("Failed to read from UDP Socket\n\r");
- return -1;
-
- case 0:
- printf("Nothing received...?\n\r");
- continue;
+ 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;
+ }
- default:
- printf("Received %d bytes from %s:%d\n\r", result,
- socket.getRemoteEndpoint().getAddress().toString().c_str(),
- socket.getRemoteEndpoint().getPort());
+ // 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;
- if (!socket.getRemoteEndpoint().getAddress().isEmpty()) {
- socket.send(buffer, result, socket.getRemoteEndpoint());
- }
- continue;
- }
- }
-
- return 0;
+ 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);
}
\ No newline at end of file