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