Same as mallet... but distance

Dependencies:   EthernetInterface NetworkAPI mbed-rtos mbed

Fork of MalletFirmware by Impact-Echo

Committer:
timmey9
Date:
Fri Nov 14 18:30:54 2014 +0000
Revision:
17:2f978f823020
Parent:
16:c3f922f61b8f
Child:
18:b17ddeeb1c09
Server/Client with preprocessor directive to distinguish.  Doesn't compile the client but works for the server.  Requires some fixing.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
timmey9 17:2f978f823020 1 #define SERVER 0
timmey9 16:c3f922f61b8f 2
timmey9 16:c3f922f61b8f 3
timmey9 17:2f978f823020 4
timmey9 17:2f978f823020 5 #if SERVER == 1
timmey9 16:c3f922f61b8f 6
donatien 0:bb128f0e952f 7 #include "mbed.h"
donatien 0:bb128f0e952f 8 #include "EthernetInterface.h"
timmey9 17:2f978f823020 9
timmey9 17:2f978f823020 10 #include "NetworkAPI/buffer.hpp"
timmey9 17:2f978f823020 11 #include "NetworkAPI/select.hpp"
timmey9 17:2f978f823020 12 #include "NetworkAPI/ip/address.hpp"
timmey9 17:2f978f823020 13 #include "NetworkAPI/tcp/socket.hpp"
timmey9 17:2f978f823020 14 using namespace network;
timmey9 17:2f978f823020 15
timmey9 17:2f978f823020 16 #define MAX_CLIENTS 5
timmey9 17:2f978f823020 17
emilmont 7:65188f4a8c25 18 int main() {
timmey9 17:2f978f823020 19 EthernetInterface interface;
timmey9 17:2f978f823020 20 interface.init();
timmey9 17:2f978f823020 21 interface.connect();
timmey9 17:2f978f823020 22 printf("IP Address is %s\n\r", interface.getIPAddress());
timmey9 17:2f978f823020 23
timmey9 17:2f978f823020 24 Select select;
timmey9 17:2f978f823020 25 tcp::Socket server;
timmey9 17:2f978f823020 26 tcp::Socket client[MAX_CLIENTS];
timmey9 17:2f978f823020 27 tcp::Socket *socket = NULL;
timmey9 17:2f978f823020 28
timmey9 17:2f978f823020 29 int result = 0;
timmey9 17:2f978f823020 30 int index = 0;
timmey9 17:2f978f823020 31
timmey9 17:2f978f823020 32 network::Buffer buffer(256);
timmey9 17:2f978f823020 33 std::string message("Hello world!");
timmey9 17:2f978f823020 34
timmey9 17:2f978f823020 35 // Configure the server socket (assume everty thing works)
timmey9 17:2f978f823020 36 server.open();
timmey9 17:2f978f823020 37 server.bind(1234);
timmey9 17:2f978f823020 38 server.listen(MAX_CLIENTS);
timmey9 17:2f978f823020 39
timmey9 17:2f978f823020 40 // Add sockets to the select api
timmey9 17:2f978f823020 41 select.set(&server, Select::Read);
timmey9 17:2f978f823020 42 for (index = 0; index < MAX_CLIENTS; index++) {
timmey9 17:2f978f823020 43 select.set(&client[index], Select::Read);
timmey9 17:2f978f823020 44 }
timmey9 17:2f978f823020 45
timmey9 17:2f978f823020 46 do {
timmey9 17:2f978f823020 47 // Wait for activity
timmey9 17:2f978f823020 48 result = select.wait();
timmey9 17:2f978f823020 49 if (result < -1) {
timmey9 17:2f978f823020 50 printf("Failed to select\n\r");
emilmont 7:65188f4a8c25 51 break;
timmey9 16:c3f922f61b8f 52 }
timmey9 17:2f978f823020 53
timmey9 17:2f978f823020 54 // Get the first socket
timmey9 17:2f978f823020 55 socket = (tcp::Socket *)select.getReadable();
timmey9 17:2f978f823020 56
timmey9 17:2f978f823020 57 for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) {
timmey9 17:2f978f823020 58 // Check if there was a connection request.
timmey9 17:2f978f823020 59 if (socket->getHandle() == server.getHandle()) {
timmey9 17:2f978f823020 60 // Find an unused client
timmey9 17:2f978f823020 61 for (index = 0; index < MAX_CLIENTS; index++) {
timmey9 17:2f978f823020 62 if (client[index].getStatus() == network::Socket::Closed) {
timmey9 17:2f978f823020 63 break;
timmey9 17:2f978f823020 64 }
timmey9 17:2f978f823020 65 }
timmey9 17:2f978f823020 66
timmey9 17:2f978f823020 67 // Maximum connections reached
timmey9 17:2f978f823020 68 if (index == MAX_CLIENTS) {
timmey9 17:2f978f823020 69 printf("Maximum connections reached\n\r");
timmey9 17:2f978f823020 70 continue;
timmey9 17:2f978f823020 71 }
timmey9 17:2f978f823020 72
timmey9 17:2f978f823020 73 // Accept the client
timmey9 17:2f978f823020 74 socket->accept(client[index]);
timmey9 17:2f978f823020 75 printf("Client connected %s:%d\n\r",
timmey9 17:2f978f823020 76 client[index].getRemoteEndpoint().getAddress().toString().c_str(),
timmey9 17:2f978f823020 77 client[index].getRemoteEndpoint().getPort());
timmey9 17:2f978f823020 78
timmey9 17:2f978f823020 79 // Send a nice message to the client
timmey9 17:2f978f823020 80 client[index].write((void *)message.data(), message.size());
timmey9 17:2f978f823020 81 continue;
timmey9 16:c3f922f61b8f 82 }
timmey9 17:2f978f823020 83
timmey9 17:2f978f823020 84 // It was not the server socket, so it must be a client talking to us.
timmey9 17:2f978f823020 85 switch (socket->read(buffer)) {
timmey9 17:2f978f823020 86 case 0:
timmey9 17:2f978f823020 87 // Remote end disconnected
timmey9 17:2f978f823020 88 printf("Client disconnected %s:%d\n\r",
timmey9 17:2f978f823020 89 socket->getRemoteEndpoint().getAddress().toString().c_str(),
timmey9 17:2f978f823020 90 socket->getRemoteEndpoint().getPort());
timmey9 17:2f978f823020 91
timmey9 17:2f978f823020 92 // Close socket
timmey9 17:2f978f823020 93 socket->close();
timmey9 17:2f978f823020 94 break;
timmey9 17:2f978f823020 95
timmey9 17:2f978f823020 96 case -1:
timmey9 17:2f978f823020 97 printf("Error while reading data from socket\n\r");
timmey9 17:2f978f823020 98 socket->close();
timmey9 17:2f978f823020 99 break;
timmey9 17:2f978f823020 100
timmey9 17:2f978f823020 101 default:
timmey9 17:2f978f823020 102 printf("Message from %s:%d\n\r",
timmey9 17:2f978f823020 103 socket->getRemoteEndpoint().getAddress().toString().c_str(),
timmey9 17:2f978f823020 104 socket->getRemoteEndpoint().getPort());
timmey9 17:2f978f823020 105
timmey9 17:2f978f823020 106 printf("%s\n\r", (char *)buffer.data());
timmey9 17:2f978f823020 107 break;
timmey9 17:2f978f823020 108 }
timmey9 16:c3f922f61b8f 109 }
timmey9 17:2f978f823020 110
timmey9 17:2f978f823020 111 } while (server.getStatus() == network::Socket::Listening);
donatien 0:bb128f0e952f 112 }
timmey9 16:c3f922f61b8f 113
timmey9 16:c3f922f61b8f 114
timmey9 16:c3f922f61b8f 115
timmey9 16:c3f922f61b8f 116 #else
timmey9 16:c3f922f61b8f 117
timmey9 17:2f978f823020 118 #include "mbed.h"
timmey9 17:2f978f823020 119 #include "EthernetInterface.h"
timmey9 17:2f978f823020 120
timmey9 17:2f978f823020 121 #include "NetworkAPI/buffer.hpp"
timmey9 17:2f978f823020 122 #include "NetworkAPI/ip/address.hpp"
timmey9 17:2f978f823020 123 #include "NetworkAPI/tcp/socket.hpp"
timmey9 17:2f978f823020 124
timmey9 16:c3f922f61b8f 125 int main() {
timmey9 17:2f978f823020 126 EthernetInterface interface;
timmey9 17:2f978f823020 127 interface.init();
timmey9 17:2f978f823020 128 interface.connect();
timmey9 17:2f978f823020 129 printf("IP Address is %s\n\r", interface.getIPAddress());
timmey9 17:2f978f823020 130
timmey9 17:2f978f823020 131 int result;
timmey9 17:2f978f823020 132
timmey9 17:2f978f823020 133 network::tcp::Socket socket;
timmey9 17:2f978f823020 134 network::Buffer buffer(256);
timmey9 17:2f978f823020 135 std::string request("GET /media/uploads/donatien/hello.txt HTTP/1.1\r\nHost: %s\r\n\r\n");
timmey9 16:c3f922f61b8f 136
timmey9 17:2f978f823020 137 if (socket.open() < 0) {
timmey9 17:2f978f823020 138 printf("Failed to open TCP Socket\n\r");
timmey9 17:2f978f823020 139 return -1;
timmey9 17:2f978f823020 140 }
timmey9 16:c3f922f61b8f 141
timmey9 17:2f978f823020 142 if (socket.connect("mbed.org", 80) < 0) {
timmey9 17:2f978f823020 143 printf("Failed to connect with mbed.org\n\r");
timmey9 17:2f978f823020 144 return -1;
timmey9 17:2f978f823020 145 }
timmey9 16:c3f922f61b8f 146
timmey9 17:2f978f823020 147 if (socket.write((void *)request.data(), request.size()) < 0) {
timmey9 17:2f978f823020 148 printf("Failed to write HTTP request\n\r");
timmey9 17:2f978f823020 149 return -1;
timmey9 17:2f978f823020 150 }
timmey9 17:2f978f823020 151
timmey9 17:2f978f823020 152 do
timmey9 16:c3f922f61b8f 153 {
timmey9 17:2f978f823020 154 result = socket.read(buffer);
timmey9 17:2f978f823020 155 printf("Received %d bytes:\n\r%s\n\r", result, (char *)buffer.pointer());
timmey9 17:2f978f823020 156 } while(result > 0);
timmey9 16:c3f922f61b8f 157
timmey9 17:2f978f823020 158 socket.close();
timmey9 17:2f978f823020 159 return 0;
timmey9 17:2f978f823020 160 }
timmey9 16:c3f922f61b8f 161
timmey9 16:c3f922f61b8f 162 #endif