Test of C++ Sockets API with Ethernet
Dependencies: mbed EthernetInterface
main.cpp@0:81648c034b7a, 2012-06-15 (annotated)
- Committer:
- donatien
- Date:
- Fri Jun 15 16:38:40 2012 +0000
- Revision:
- 0:81648c034b7a
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |