First commit
Dependencies: EthernetInterface FXAS21002 FXOS8700 NetworkAPI mbed-rtos mbed
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