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:
- 10:9e8d5928537a
- Parent:
- 9:a4c85bea2d77
- Child:
- 11:90554d22ade5
--- a/main.cpp Wed Jul 18 18:45:57 2012 +0000
+++ b/main.cpp Thu Sep 27 09:35:46 2012 +0000
@@ -2,12 +2,11 @@
#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
+#define PORT 1234
+#define MAX_PENDING 1
int
main()
@@ -17,92 +16,55 @@
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;
+ tcp::Socket client;
+
+ Buffer buffer(256);
- network::Buffer buffer(256);
- std::string message("Hello world!");
+ if (server.open() < 0) {
+ printf("Could not open server socket.\n\r");
+ return -1;
+ }
- // 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;
}
- do {
- // Wait for activity
- result = select.wait();
- if (result < -1) {
- printf("Failed to select\n\r");
- break;
+ 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;
}
-
- // Get the first socket
- socket = (tcp::Socket *)select.getReadable();
+
+ printf("Client connected '%s:%d'.\n\r",
+ client.getRemoteEndpoint().getAddress().toString().c_str(),
+ client.getRemoteEndpoint().getPort());
- 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;
- }
+ while (client.getStatus() == tcp::Socket::Connected) {
+ buffer.flush();
- // 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();
+ switch (client.read(buffer)) {
+ case -1:
+ printf("Warning: failed to read data from client.\n\r");
break;
- case -1:
- printf("Error while reading data from socket\n\r");
- socket->close();
+ case 0:
+ printf("Connection closed.\n\r");
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;
+ printf("Received %d bytes.\n\r%s\r", buffer.length(), (char *)buffer.data());
+ continue;
}
+
+ client.shutdown();
+ client.close();
}
-
- } while (server.getStatus() == Socket::Listening);
+ }
}
\ No newline at end of file