![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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)
Diff: main.cpp
- Revision:
- 12:9bef73198a53
- Parent:
- 11:59dcefdda506
- Child:
- 14:c3694118dd57
diff -r 59dcefdda506 -r 9bef73198a53 main.cpp --- a/main.cpp Fri Aug 10 09:41:51 2012 +0000 +++ b/main.cpp Tue Feb 26 21:39:22 2013 +0000 @@ -1,31 +1,90 @@ #include "mbed.h" #include "EthernetInterface.h" -int main() { - EthernetInterface eth; - eth.init(); //Use DHCP - eth.connect(); +#define RETRIES_ALLOWED 5 + +Serial pc(USBTX, USBRX); +EthernetInterface eth; +DigitalOut led1(LED1); + +int main() +{ + + pc.baud(115200); + printf("Initialising...\n"); + set_time(0); + + // use DHCP + eth.init(); + + // attempt DHCP and if timing out then try again + while (eth.connect()) { + printf("DHCP timeout\n"); + }; + + // successful DHCP printf("IP Address is %s\n", eth.getIPAddress()); - - TCPSocketConnection sock; - sock.connect("mbed.org", 80); - - char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n"; - sock.send_all(http_cmd, sizeof(http_cmd)-1); - - char buffer[300]; - int ret; + + // loop forever while (true) { - ret = sock.receive(buffer, sizeof(buffer)-1); - if (ret <= 0) - break; - buffer[ret] = '\0'; - printf("Received %d chars from server:\n%s\n", ret, buffer); + + // new non blocking socket + TCPSocketConnection sock; + sock.set_blocking(false); + + // toggle led to indicate activity + led1 = !led1; + + // attempt socket connection and if failure then loop again + if (sock.connect("mbed.org", 80)) { + printf("Socket connect timeout\n"); + continue; + } + + // send command + printf("Sending at %d seconds\n", time(NULL)); + char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n"; + sock.send_all(http_cmd, sizeof(http_cmd) - 1); + + // receive response + int received = 0; + int retries = 0; + while (true) { + + int result; + char buffer[256]; + + result = sock.receive(buffer, sizeof(buffer) - 1); + printf("Received: %d %d %d\n", result, received, retries); + + // if timeout or no data + if (result <= 0) { + + // if data previously received then stop receiving + if (received > 0) + break; + + // if incremented retries exceeded then no response and stop receiving + if (++retries > RETRIES_ALLOWED) { + break; + } + + } else { + + // zero terminate the buffer + buffer[result] = '\0'; + + // total size of data received + received += result; + } + + } + + // close socket at end of send and receive + sock.close(); + + // wait before repeating + Thread::wait(1000); + } - - sock.close(); - - eth.disconnect(); - - while(1) {} -} +} \ No newline at end of file