Simple HTTP server example with WIZ550io, W5500 (WIZnet chipset) .access the mbed via any browser, mbed echo back http request header.

Dependencies:   W5500Interface mbed

Fork of HTTPServer_echoback_WIZ550io by Bongjun Hur

Revision:
13:25ce35614dd1
Parent:
11:59dcefdda506
Child:
14:607402be8868
Child:
15:eae1575da9ca
--- a/main.cpp	Fri Mar 01 16:05:34 2013 +0000
+++ b/main.cpp	Tue Mar 05 07:29:19 2013 +0000
@@ -1,31 +1,95 @@
 #include "mbed.h"
 #include "EthernetInterface.h"
+#include <stdio.h>
+#include <string.h>
 
-int main() {
-    EthernetInterface eth;
+#define PORT   80
+
+EthernetInterface eth;
+
+TCPSocketServer svr;
+bool serverIsListened = false;
+
+TCPSocketConnection client;
+bool clientIsConnected = false;
+
+DigitalOut led1(LED1); //server listning status
+DigitalOut led2(LED2); //socket connecting status
+
+Ticker ledTick;
+
+void ledTickfunc()
+{
+    if(serverIsListened)  {
+        led1 = !led1;
+    } else {
+        led1 = false;
+    }
+}
+
+int main (void)
+{
+    ledTick.attach(&ledTickfunc,0.5);
+
+    //setup ethernet interface
     eth.init(); //Use DHCP
     eth.connect();
-    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;
-    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);
+    printf("IP Address is %s\n\r", eth.getIPAddress());
+
+    //setup tcp socket
+    if(svr.bind(PORT)< 0) {
+        printf("tcp server bind failed.\n\r");
+        return -1;
+    } else {
+        printf("tcp server bind successed.\n\r");
+        serverIsListened = true;
+    }
+
+    if(svr.listen(1) < 0) {
+        printf("tcp server listen failed.\n\r");
+        return -1;
+    } else {
+        printf("tcp server is listening...\n\r");
     }
-      
-    sock.close();
-    
-    eth.disconnect();
-    
-    while(1) {}
+
+    //listening for http GET request
+    while (serverIsListened) {
+        if(svr.accept(client)<0) {
+            printf("failed to accept connection.\n\r");
+        } else {
+            printf("connection success!\n\rIP: %s\n\r",client.get_address());
+            clientIsConnected = true;
+            led2 = true;
+            
+            while(clientIsConnected) {
+                char buffer[1024] = {};
+                switch(client.receive(buffer, 1023)) {
+                    case 0:
+                        printf("recieved buffer is empty.\n\r");
+                        clientIsConnected = false;
+                        break;
+                    case -1:
+                        printf("failed to read data from client.\n\r");
+                        clientIsConnected = false;
+                        break;
+                    default:
+                        printf("Recieved Data: %d\n\r\n\r%.*s\n\r",strlen(buffer),strlen(buffer),buffer);
+                        if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) {
+                            printf("GET request incomming.\n\r");
+                            //setup http response header & data
+                            char echoHeader[256] = {};
+                            sprintf(echoHeader,"HTTP/1.1 200 OK\n\rContent-Length: %d\n\rContent-Type: text\n\rConnection: Close\n\r\n\r",strlen(buffer));
+                            client.send(echoHeader,strlen(echoHeader));
+                            client.send(buffer,strlen(buffer));
+                            clientIsConnected = false;
+                            printf("echo back done.\n\r");
+                        }
+                        break;
+                }
+            }
+            printf("close connection.\n\rtcp server is listening...\n\r");
+            client.close();
+            led2 = false;
+        }
+    }
 }