This is a quick example of a simple HTTP client program using the network-socket API that is provided as a part of mbed-os. The program brings up an underlying network interface, and uses it to perform an HTTP transaction over a TCPSocket.

Committer:
mbed_official
Date:
Wed Jun 06 15:00:09 2018 +0100
Revision:
47:08787ef063cb
Parent:
40:afef93b6d854
Child:
48:f2739ac5cb01
Add error checks to network interface and socket calls

.
Commit copied from https://github.com/ARMmbed/mbed-os-example-sockets

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:17bd84fc5087 1 #include "mbed.h"
mbed_official 5:3e952c60d705 2 #include "EthernetInterface.h"
mbed_official 0:17bd84fc5087 3
mbed_official 5:3e952c60d705 4 // Network interface
mbed_official 5:3e952c60d705 5 EthernetInterface net;
mbed_official 0:17bd84fc5087 6
mbed_official 0:17bd84fc5087 7 // Socket demo
mbed_official 5:3e952c60d705 8 int main() {
mbed_official 47:08787ef063cb 9 int remaining;
mbed_official 47:08787ef063cb 10 int rcount;
mbed_official 47:08787ef063cb 11 char *p;
mbed_official 47:08787ef063cb 12 char *buffer = new char[256];
mbed_official 47:08787ef063cb 13 nsapi_size_or_error_t r;
mbed_official 47:08787ef063cb 14
mbed_official 5:3e952c60d705 15 // Bring up the ethernet interface
mbed_official 5:3e952c60d705 16 printf("Ethernet socket example\n");
mbed_official 47:08787ef063cb 17 r = net.connect();
mbed_official 47:08787ef063cb 18 if (r != 0) {
mbed_official 47:08787ef063cb 19 printf("Error! net.connect() returned: %d\n", r);
mbed_official 47:08787ef063cb 20 }
mbed_official 0:17bd84fc5087 21
mbed_official 0:17bd84fc5087 22 // Show the network address
mbed_official 5:3e952c60d705 23 const char *ip = net.get_ip_address();
mbed_official 13:ed9e4aa00044 24 const char *netmask = net.get_netmask();
mbed_official 13:ed9e4aa00044 25 const char *gateway = net.get_gateway();
mbed_official 13:ed9e4aa00044 26 printf("IP address: %s\n", ip ? ip : "None");
mbed_official 13:ed9e4aa00044 27 printf("Netmask: %s\n", netmask ? netmask : "None");
mbed_official 13:ed9e4aa00044 28 printf("Gateway: %s\n", gateway ? gateway : "None");
mbed_official 0:17bd84fc5087 29
mbed_official 0:17bd84fc5087 30 // Open a socket on the network interface, and create a TCP connection to mbed.org
mbed_official 5:3e952c60d705 31 TCPSocket socket;
mbed_official 47:08787ef063cb 32 r = socket.open(&net);
mbed_official 47:08787ef063cb 33 if (r != 0) {
mbed_official 47:08787ef063cb 34 printf("Error! socket.open() returned: %d\n", r);
mbed_official 47:08787ef063cb 35 }
mbed_official 0:17bd84fc5087 36
mbed_official 47:08787ef063cb 37 r = socket.connect("api.ipify.org", 80);
mbed_official 47:08787ef063cb 38 if (r != 0) {
mbed_official 47:08787ef063cb 39 printf("Error! socket.connect() returned: %d\n", r);
mbed_official 47:08787ef063cb 40 }
mbed_official 47:08787ef063cb 41
mbed_official 47:08787ef063cb 42 // Send a simple http request
mbed_official 47:08787ef063cb 43 char sbuffer[] = "GET / HTTP/1.1\r\nHost: api.ipify.org\r\nConnection: close\r\n\r\n";
mbed_official 47:08787ef063cb 44 nsapi_size_t size = strlen(sbuffer);
mbed_official 0:17bd84fc5087 45
mbed_official 47:08787ef063cb 46 // Loop until whole request send
mbed_official 47:08787ef063cb 47 while(size) {
mbed_official 47:08787ef063cb 48 r = socket.send(sbuffer+r, size);
mbed_official 47:08787ef063cb 49 if (r < 0) {
mbed_official 47:08787ef063cb 50 printf("Error! socket.connect() returned: %d\n", r);
mbed_official 47:08787ef063cb 51 goto disconnect;
mbed_official 47:08787ef063cb 52 }
mbed_official 47:08787ef063cb 53 size -= r;
mbed_official 47:08787ef063cb 54 printf("sent %d [%.*s]\n", r, strstr(sbuffer, "\r\n")-sbuffer, sbuffer);
mbed_official 40:afef93b6d854 55 }
mbed_official 47:08787ef063cb 56
mbed_official 47:08787ef063cb 57 // Receieve an HTTP response and print out the response line
mbed_official 47:08787ef063cb 58 remaining = 256;
mbed_official 47:08787ef063cb 59 rcount = 0;
mbed_official 47:08787ef063cb 60 p = buffer;
mbed_official 47:08787ef063cb 61 while (0 < (r = socket.recv(p, remaining))) {
mbed_official 47:08787ef063cb 62 p += r;
mbed_official 47:08787ef063cb 63 rcount += r;
mbed_official 47:08787ef063cb 64 remaining -= r;
mbed_official 47:08787ef063cb 65 }
mbed_official 47:08787ef063cb 66 if (r < 0) {
mbed_official 47:08787ef063cb 67 printf("Error! socket.recv() returned: %d\n", r);
mbed_official 47:08787ef063cb 68 goto disconnect;
mbed_official 47:08787ef063cb 69 }
mbed_official 47:08787ef063cb 70
mbed_official 13:ed9e4aa00044 71 printf("recv %d [%.*s]\n", rcount, strstr(buffer, "\r\n")-buffer, buffer);
mbed_official 13:ed9e4aa00044 72
mbed_official 13:ed9e4aa00044 73 // The api.ipify.org service also gives us the device's external IP address
mbed_official 47:08787ef063cb 74 p = strstr(buffer, "\r\n\r\n")+4;
mbed_official 47:08787ef063cb 75 printf("External IP address: %.*s\n", rcount-(p-buffer), p);
mbed_official 47:08787ef063cb 76 delete[] buffer;
mbed_official 0:17bd84fc5087 77
mbed_official 47:08787ef063cb 78 disconnect:
mbed_official 0:17bd84fc5087 79 // Close the socket to return its memory and bring down the network interface
mbed_official 0:17bd84fc5087 80 socket.close();
mbed_official 0:17bd84fc5087 81
mbed_official 5:3e952c60d705 82 // Bring down the ethernet interface
mbed_official 5:3e952c60d705 83 net.disconnect();
mbed_official 0:17bd84fc5087 84 printf("Done\n");
mbed_official 0:17bd84fc5087 85 }