Test to demonstrate that TCP sockets lock up
Dependencies: EthernetInterface mbed-rtos mbed
Fork of TCPSocket_HelloWorld by
EthernetInterface to revision 32 (mbed-rtos to revision 12, mbed to revision 63)
main.cpp@12:9bef73198a53, 2013-02-26 (annotated)
- Committer:
- mbed714
- Date:
- Tue Feb 26 21:39:22 2013 +0000
- Revision:
- 12:9bef73198a53
- Parent:
- 11:59dcefdda506
- Child:
- 14:c3694118dd57
Locks up
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
donatien | 0:bb128f0e952f | 1 | #include "mbed.h" |
donatien | 0:bb128f0e952f | 2 | #include "EthernetInterface.h" |
donatien | 0:bb128f0e952f | 3 | |
mbed714 | 12:9bef73198a53 | 4 | #define RETRIES_ALLOWED 5 |
mbed714 | 12:9bef73198a53 | 5 | |
mbed714 | 12:9bef73198a53 | 6 | Serial pc(USBTX, USBRX); |
mbed714 | 12:9bef73198a53 | 7 | EthernetInterface eth; |
mbed714 | 12:9bef73198a53 | 8 | DigitalOut led1(LED1); |
mbed714 | 12:9bef73198a53 | 9 | |
mbed714 | 12:9bef73198a53 | 10 | int main() |
mbed714 | 12:9bef73198a53 | 11 | { |
mbed714 | 12:9bef73198a53 | 12 | |
mbed714 | 12:9bef73198a53 | 13 | pc.baud(115200); |
mbed714 | 12:9bef73198a53 | 14 | printf("Initialising...\n"); |
mbed714 | 12:9bef73198a53 | 15 | set_time(0); |
mbed714 | 12:9bef73198a53 | 16 | |
mbed714 | 12:9bef73198a53 | 17 | // use DHCP |
mbed714 | 12:9bef73198a53 | 18 | eth.init(); |
mbed714 | 12:9bef73198a53 | 19 | |
mbed714 | 12:9bef73198a53 | 20 | // attempt DHCP and if timing out then try again |
mbed714 | 12:9bef73198a53 | 21 | while (eth.connect()) { |
mbed714 | 12:9bef73198a53 | 22 | printf("DHCP timeout\n"); |
mbed714 | 12:9bef73198a53 | 23 | }; |
mbed714 | 12:9bef73198a53 | 24 | |
mbed714 | 12:9bef73198a53 | 25 | // successful DHCP |
emilmont | 2:e087e9b789e9 | 26 | printf("IP Address is %s\n", eth.getIPAddress()); |
mbed714 | 12:9bef73198a53 | 27 | |
mbed714 | 12:9bef73198a53 | 28 | // loop forever |
emilmont | 7:65188f4a8c25 | 29 | while (true) { |
mbed714 | 12:9bef73198a53 | 30 | |
mbed714 | 12:9bef73198a53 | 31 | // new non blocking socket |
mbed714 | 12:9bef73198a53 | 32 | TCPSocketConnection sock; |
mbed714 | 12:9bef73198a53 | 33 | sock.set_blocking(false); |
mbed714 | 12:9bef73198a53 | 34 | |
mbed714 | 12:9bef73198a53 | 35 | // toggle led to indicate activity |
mbed714 | 12:9bef73198a53 | 36 | led1 = !led1; |
mbed714 | 12:9bef73198a53 | 37 | |
mbed714 | 12:9bef73198a53 | 38 | // attempt socket connection and if failure then loop again |
mbed714 | 12:9bef73198a53 | 39 | if (sock.connect("mbed.org", 80)) { |
mbed714 | 12:9bef73198a53 | 40 | printf("Socket connect timeout\n"); |
mbed714 | 12:9bef73198a53 | 41 | continue; |
mbed714 | 12:9bef73198a53 | 42 | } |
mbed714 | 12:9bef73198a53 | 43 | |
mbed714 | 12:9bef73198a53 | 44 | // send command |
mbed714 | 12:9bef73198a53 | 45 | printf("Sending at %d seconds\n", time(NULL)); |
mbed714 | 12:9bef73198a53 | 46 | char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n"; |
mbed714 | 12:9bef73198a53 | 47 | sock.send_all(http_cmd, sizeof(http_cmd) - 1); |
mbed714 | 12:9bef73198a53 | 48 | |
mbed714 | 12:9bef73198a53 | 49 | // receive response |
mbed714 | 12:9bef73198a53 | 50 | int received = 0; |
mbed714 | 12:9bef73198a53 | 51 | int retries = 0; |
mbed714 | 12:9bef73198a53 | 52 | while (true) { |
mbed714 | 12:9bef73198a53 | 53 | |
mbed714 | 12:9bef73198a53 | 54 | int result; |
mbed714 | 12:9bef73198a53 | 55 | char buffer[256]; |
mbed714 | 12:9bef73198a53 | 56 | |
mbed714 | 12:9bef73198a53 | 57 | result = sock.receive(buffer, sizeof(buffer) - 1); |
mbed714 | 12:9bef73198a53 | 58 | printf("Received: %d %d %d\n", result, received, retries); |
mbed714 | 12:9bef73198a53 | 59 | |
mbed714 | 12:9bef73198a53 | 60 | // if timeout or no data |
mbed714 | 12:9bef73198a53 | 61 | if (result <= 0) { |
mbed714 | 12:9bef73198a53 | 62 | |
mbed714 | 12:9bef73198a53 | 63 | // if data previously received then stop receiving |
mbed714 | 12:9bef73198a53 | 64 | if (received > 0) |
mbed714 | 12:9bef73198a53 | 65 | break; |
mbed714 | 12:9bef73198a53 | 66 | |
mbed714 | 12:9bef73198a53 | 67 | // if incremented retries exceeded then no response and stop receiving |
mbed714 | 12:9bef73198a53 | 68 | if (++retries > RETRIES_ALLOWED) { |
mbed714 | 12:9bef73198a53 | 69 | break; |
mbed714 | 12:9bef73198a53 | 70 | } |
mbed714 | 12:9bef73198a53 | 71 | |
mbed714 | 12:9bef73198a53 | 72 | } else { |
mbed714 | 12:9bef73198a53 | 73 | |
mbed714 | 12:9bef73198a53 | 74 | // zero terminate the buffer |
mbed714 | 12:9bef73198a53 | 75 | buffer[result] = '\0'; |
mbed714 | 12:9bef73198a53 | 76 | |
mbed714 | 12:9bef73198a53 | 77 | // total size of data received |
mbed714 | 12:9bef73198a53 | 78 | received += result; |
mbed714 | 12:9bef73198a53 | 79 | } |
mbed714 | 12:9bef73198a53 | 80 | |
mbed714 | 12:9bef73198a53 | 81 | } |
mbed714 | 12:9bef73198a53 | 82 | |
mbed714 | 12:9bef73198a53 | 83 | // close socket at end of send and receive |
mbed714 | 12:9bef73198a53 | 84 | sock.close(); |
mbed714 | 12:9bef73198a53 | 85 | |
mbed714 | 12:9bef73198a53 | 86 | // wait before repeating |
mbed714 | 12:9bef73198a53 | 87 | Thread::wait(1000); |
mbed714 | 12:9bef73198a53 | 88 | |
emilmont | 7:65188f4a8c25 | 89 | } |
mbed714 | 12:9bef73198a53 | 90 | } |