Test of C++ Sockets API with Ethernet

Dependencies:   mbed EthernetInterface

Committer:
donatien
Date:
Fri Jun 22 16:28:13 2012 +0000
Revision:
2:77ba190e8258
Parent:
0:81648c034b7a
EthernetInterface up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:81648c034b7a 1 /* cpp_sockets_test.cpp */
donatien 0:81648c034b7a 2 /*
donatien 0:81648c034b7a 3 Copyright (C) 2012 ARM Limited.
donatien 0:81648c034b7a 4
donatien 0:81648c034b7a 5 Permission is hereby granted, free of charge, to any person obtaining a copy of
donatien 0:81648c034b7a 6 this software and associated documentation files (the "Software"), to deal in
donatien 0:81648c034b7a 7 the Software without restriction, including without limitation the rights to
donatien 0:81648c034b7a 8 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
donatien 0:81648c034b7a 9 of the Software, and to permit persons to whom the Software is furnished to do
donatien 0:81648c034b7a 10 so, subject to the following conditions:
donatien 0:81648c034b7a 11
donatien 0:81648c034b7a 12 The above copyright notice and this permission notice shall be included in all
donatien 0:81648c034b7a 13 copies or substantial portions of the Software.
donatien 0:81648c034b7a 14
donatien 0:81648c034b7a 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:81648c034b7a 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:81648c034b7a 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:81648c034b7a 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:81648c034b7a 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:81648c034b7a 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
donatien 0:81648c034b7a 21 SOFTWARE.
donatien 0:81648c034b7a 22 */
donatien 0:81648c034b7a 23
donatien 0:81648c034b7a 24 #define __DEBUG__ 4 //Maximum verbosity
donatien 0:81648c034b7a 25 #ifndef __MODULE__
donatien 0:81648c034b7a 26 #define __MODULE__ "cpp_sockets_test.cpp"
donatien 0:81648c034b7a 27 #endif
donatien 0:81648c034b7a 28
donatien 0:81648c034b7a 29 #include "core/fwk.h"
donatien 0:81648c034b7a 30 #include "mbed.h"
donatien 0:81648c034b7a 31
donatien 0:81648c034b7a 32 #include "rtos.h"
donatien 0:81648c034b7a 33
donatien 0:81648c034b7a 34 #include "EthernetInterface.h"
donatien 0:81648c034b7a 35 #include "TCPSocket.h"
donatien 0:81648c034b7a 36 #include "UDPSocket.h"
donatien 0:81648c034b7a 37
donatien 0:81648c034b7a 38 #define CHECK_ERR(ret) if(ret < 0) break;
donatien 0:81648c034b7a 39
donatien 0:81648c034b7a 40 DigitalOut led1(LED1);
donatien 0:81648c034b7a 41 DigitalOut led2(LED2);
donatien 0:81648c034b7a 42 DigitalOut led3(LED3);
donatien 0:81648c034b7a 43 DigitalOut led4(LED4);
donatien 0:81648c034b7a 44 void notify(bool a, bool b, bool c)
donatien 0:81648c034b7a 45 {
donatien 0:81648c034b7a 46 led1 = a;
donatien 0:81648c034b7a 47 led2 = b;
donatien 0:81648c034b7a 48 led3 = c;
donatien 0:81648c034b7a 49 }
donatien 0:81648c034b7a 50
donatien 0:81648c034b7a 51 extern "C" void HardFault_Handler()
donatien 0:81648c034b7a 52 {
donatien 0:81648c034b7a 53 error("Hard Fault!\n");
donatien 0:81648c034b7a 54 }
donatien 0:81648c034b7a 55
donatien 0:81648c034b7a 56 void test(void const*)
donatien 0:81648c034b7a 57 {
donatien 0:81648c034b7a 58 EthernetInterface eth;
donatien 0:81648c034b7a 59 DBG("Hello!");
donatien 0:81648c034b7a 60
donatien 0:81648c034b7a 61 int count = 0;
donatien 0:81648c034b7a 62 eth.init(); //Use DHCP
donatien 0:81648c034b7a 63
donatien 0:81648c034b7a 64 count++;
donatien 0:81648c034b7a 65 DBG("iteration #%d", count);
donatien 0:81648c034b7a 66
donatien 0:81648c034b7a 67 char in_buf[256];
donatien 0:81648c034b7a 68
donatien 0:81648c034b7a 69 notify(0, 1, 1);
donatien 0:81648c034b7a 70 int ret = eth.connect();
donatien 0:81648c034b7a 71 notify(0, 1, 0);
donatien 0:81648c034b7a 72 if (ret == OK)
donatien 0:81648c034b7a 73 {
donatien 0:81648c034b7a 74 //TCP Socket test
donatien 0:81648c034b7a 75 do
donatien 0:81648c034b7a 76 {
donatien 0:81648c034b7a 77 DBG("TCP Client test");
donatien 0:81648c034b7a 78 TCPSocket sock;
donatien 0:81648c034b7a 79 //http://mbed.org/media/uploads/donatien/hello.txt
donatien 0:81648c034b7a 80 ret = sock.connect("mbed.org", 80);
donatien 0:81648c034b7a 81 CHECK_ERR(ret);
donatien 0:81648c034b7a 82 const char http_cmd[] = "GET /media/uploads/donatien/hello.txt HTTP/1.1\r\nHost: %s\r\n\r\n";
donatien 0:81648c034b7a 83 ret = sock.send((std::uint8_t*)http_cmd, sizeof(http_cmd) - 1, 3000);
donatien 0:81648c034b7a 84 CHECK_ERR(ret);
donatien 0:81648c034b7a 85
donatien 0:81648c034b7a 86 bool firstIt = true;
donatien 0:81648c034b7a 87 do
donatien 0:81648c034b7a 88 {
donatien 0:81648c034b7a 89 ret = sock.receive((std::uint8_t*)in_buf, 255, firstIt?3000:0);
donatien 0:81648c034b7a 90 CHECK_ERR(ret);
donatien 0:81648c034b7a 91 in_buf[ret] = '\0';
donatien 0:81648c034b7a 92 DBG("Received %d chars from server: %s", ret, in_buf);
donatien 0:81648c034b7a 93 firstIt = false;
donatien 0:81648c034b7a 94 } while( ret > 0 );
donatien 0:81648c034b7a 95 CHECK_ERR(ret);
donatien 0:81648c034b7a 96 ret = sock.close();
donatien 0:81648c034b7a 97 CHECK_ERR(ret);
donatien 0:81648c034b7a 98 } while(0);
donatien 0:81648c034b7a 99 if(ret < 0)
donatien 0:81648c034b7a 100 {
donatien 0:81648c034b7a 101 WARN("TCP Client test failed");
donatien 0:81648c034b7a 102 }
donatien 0:81648c034b7a 103 else
donatien 0:81648c034b7a 104 {
donatien 0:81648c034b7a 105 DBG("TCP Client test succeeded");
donatien 0:81648c034b7a 106 }
donatien 0:81648c034b7a 107
donatien 0:81648c034b7a 108 do
donatien 0:81648c034b7a 109 {
donatien 0:81648c034b7a 110 DBG("TCP Server test");
donatien 0:81648c034b7a 111 TCPSocket sock;
donatien 0:81648c034b7a 112 ret = sock.bind(80); //Listen on all interfaces
donatien 0:81648c034b7a 113 CHECK_ERR(ret);
donatien 0:81648c034b7a 114
donatien 0:81648c034b7a 115 TCPSocket hdlrSock;
donatien 0:81648c034b7a 116 ret = sock.listen(1);
donatien 0:81648c034b7a 117 CHECK_ERR(ret);
donatien 0:81648c034b7a 118 DBG("Now listening on port 80, open a browser and try to fetch the page");
donatien 0:81648c034b7a 119
donatien 0:81648c034b7a 120 char* inHost;
donatien 0:81648c034b7a 121 int inPort;
donatien 0:81648c034b7a 122 ret = sock.accept(hdlrSock, &inHost, &inPort, 150000);
donatien 0:81648c034b7a 123 CHECK_ERR(ret);
donatien 0:81648c034b7a 124 DBG("Connection from %s on port %d", inHost, inPort);
donatien 0:81648c034b7a 125 bool firstIt = true;
donatien 0:81648c034b7a 126 do
donatien 0:81648c034b7a 127 {
donatien 0:81648c034b7a 128 ret = hdlrSock.receive((std::uint8_t*)in_buf, 255, firstIt?3000:0);
donatien 0:81648c034b7a 129 CHECK_ERR(ret);
donatien 0:81648c034b7a 130 in_buf[ret] = '\0';
donatien 0:81648c034b7a 131 DBG("Received %d chars from client: %s", ret, in_buf);
donatien 0:81648c034b7a 132 firstIt = false;
donatien 0:81648c034b7a 133 } while( ret > 0 );
donatien 0:81648c034b7a 134 CHECK_ERR(ret);
donatien 0:81648c034b7a 135
donatien 0:81648c034b7a 136 const char http_resp[] = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 12\r\n\r\nHello world!";
donatien 0:81648c034b7a 137 ret = hdlrSock.send((std::uint8_t*)http_resp, sizeof(http_resp) - 1, 3000);
donatien 0:81648c034b7a 138 CHECK_ERR(ret);
donatien 0:81648c034b7a 139
donatien 0:81648c034b7a 140 ret = hdlrSock.close();
donatien 0:81648c034b7a 141 CHECK_ERR(ret);
donatien 0:81648c034b7a 142
donatien 0:81648c034b7a 143 ret = sock.close();
donatien 0:81648c034b7a 144 CHECK_ERR(ret);
donatien 0:81648c034b7a 145 } while(0);
donatien 0:81648c034b7a 146 if(ret < 0)
donatien 0:81648c034b7a 147 {
donatien 0:81648c034b7a 148 WARN("TCP Server test failed");
donatien 0:81648c034b7a 149 }
donatien 0:81648c034b7a 150 else
donatien 0:81648c034b7a 151 {
donatien 0:81648c034b7a 152 DBG("TCP Server test succeeded");
donatien 0:81648c034b7a 153 }
donatien 0:81648c034b7a 154
donatien 0:81648c034b7a 155 //UDP Socket test
donatien 0:81648c034b7a 156 do
donatien 0:81648c034b7a 157 {
donatien 0:81648c034b7a 158 DBG("UDP Client test");
donatien 0:81648c034b7a 159 UDPSocket sock;
donatien 0:81648c034b7a 160 sock.bind(0); //Use a random port
donatien 0:81648c034b7a 161 const char daytime_cmd[] = "plop"; //Does not matter
donatien 0:81648c034b7a 162 ret = sock.sendTo((std::uint8_t*)daytime_cmd, sizeof(daytime_cmd) - 1, "utcnist.colorado.edu", 37, 3000);
donatien 0:81648c034b7a 163 CHECK_ERR(ret);
donatien 0:81648c034b7a 164
donatien 0:81648c034b7a 165 char* inHost;
donatien 0:81648c034b7a 166 int inPort;
donatien 0:81648c034b7a 167 ret = sock.receiveFrom((std::uint8_t*)in_buf, 4, &inHost, &inPort, 3000);
donatien 0:81648c034b7a 168 CHECK_ERR(ret);
donatien 0:81648c034b7a 169
donatien 0:81648c034b7a 170 std::uint32_t timeRes = ntohl( *((std::uint32_t*)in_buf));
donatien 0:81648c034b7a 171
donatien 0:81648c034b7a 172 DBG("Received %d bytes from server %s on port %d: %u seconds since 1/01/1900 00:00 GMT", ret, inHost, inPort, timeRes);
donatien 0:81648c034b7a 173
donatien 0:81648c034b7a 174 ret = sock.close();
donatien 0:81648c034b7a 175 CHECK_ERR(ret);
donatien 0:81648c034b7a 176 } while(0);
donatien 0:81648c034b7a 177 if(ret < 0)
donatien 0:81648c034b7a 178 {
donatien 0:81648c034b7a 179 WARN("UDP Client test failed");
donatien 0:81648c034b7a 180 }
donatien 0:81648c034b7a 181 else
donatien 0:81648c034b7a 182 {
donatien 0:81648c034b7a 183 DBG("UDP Client test succeeded");
donatien 0:81648c034b7a 184 }
donatien 0:81648c034b7a 185
donatien 0:81648c034b7a 186 }
donatien 0:81648c034b7a 187 eth.disconnect();
donatien 0:81648c034b7a 188 DBG("Disconnected");
donatien 0:81648c034b7a 189
donatien 0:81648c034b7a 190 notify(1, 1, 1);
donatien 0:81648c034b7a 191
donatien 0:81648c034b7a 192 while (1)
donatien 0:81648c034b7a 193 {
donatien 0:81648c034b7a 194 Thread::wait(100);
donatien 0:81648c034b7a 195 }
donatien 0:81648c034b7a 196 }
donatien 0:81648c034b7a 197
donatien 0:81648c034b7a 198 void keepAlive(void const*)
donatien 0:81648c034b7a 199 {
donatien 0:81648c034b7a 200 while (1)
donatien 0:81648c034b7a 201 {
donatien 0:81648c034b7a 202 led1 = !led1;
donatien 0:81648c034b7a 203 Thread::wait(500);
donatien 0:81648c034b7a 204 }
donatien 0:81648c034b7a 205 }
donatien 0:81648c034b7a 206
donatien 0:81648c034b7a 207 void tick()
donatien 0:81648c034b7a 208 {
donatien 0:81648c034b7a 209 led4 = !led4;
donatien 0:81648c034b7a 210 }
donatien 0:81648c034b7a 211
donatien 0:81648c034b7a 212 int main()
donatien 0:81648c034b7a 213 {
donatien 0:81648c034b7a 214 Ticker t;
donatien 0:81648c034b7a 215 t.attach(tick, 1);
donatien 0:81648c034b7a 216 DBG_INIT();
donatien 0:81648c034b7a 217 notify(1, 0, 0);
donatien 0:81648c034b7a 218
donatien 0:81648c034b7a 219 Thread testTask(test, NULL, osPriorityNormal, 1024 * 4);
donatien 0:81648c034b7a 220 keepAlive(NULL);
donatien 0:81648c034b7a 221
donatien 0:81648c034b7a 222 return 0;
donatien 0:81648c034b7a 223 }