![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
CookieServer
Dependencies: EthernetInterface mbed-rtos mbed
Fork of TCP-TCPEchoServer by
mbed_tcp_cookie_server_Sunil_Aluri.cpp@6:9044de9736a1, 2014-05-13 (annotated)
- Committer:
- sunilaluri6
- Date:
- Tue May 13 03:44:37 2014 +0000
- Revision:
- 6:9044de9736a1
Cookie Server
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunilaluri6 | 6:9044de9736a1 | 1 | /***********************************************************************/ |
sunilaluri6 | 6:9044de9736a1 | 2 | /******************************Prologue*********************************/ |
sunilaluri6 | 6:9044de9736a1 | 3 | /* University of California Santa Cruz Extension */ |
sunilaluri6 | 6:9044de9736a1 | 4 | /* */ |
sunilaluri6 | 6:9044de9736a1 | 5 | /* Internet of Things */ |
sunilaluri6 | 6:9044de9736a1 | 6 | /* Instructor: Avnish Aggarwal */ |
sunilaluri6 | 6:9044de9736a1 | 7 | /* Author: Sunil Aluri */ |
sunilaluri6 | 6:9044de9736a1 | 8 | /* Assignment 4 part2a */ |
sunilaluri6 | 6:9044de9736a1 | 9 | /* */ |
sunilaluri6 | 6:9044de9736a1 | 10 | /* File name: mbed_tcp_cookie_server_Sunil_Aluri.cpp */ |
sunilaluri6 | 6:9044de9736a1 | 11 | /* Date:5/12/2014 */ |
sunilaluri6 | 6:9044de9736a1 | 12 | /* Objective: Develop a program to */ |
sunilaluri6 | 6:9044de9736a1 | 13 | /* fetch cookies,date from internet and send them to client */ |
sunilaluri6 | 6:9044de9736a1 | 14 | /* each time it connects */ |
sunilaluri6 | 6:9044de9736a1 | 15 | /* Comments: Since, I do not have two Mbed boards, used a */ |
sunilaluri6 | 6:9044de9736a1 | 16 | /* telent client to get the server data */ |
sunilaluri6 | 6:9044de9736a1 | 17 | /***********************************************************************/ |
sunilaluri6 | 6:9044de9736a1 | 18 | |
sunilaluri6 | 6:9044de9736a1 | 19 | |
sunilaluri6 | 6:9044de9736a1 | 20 | #include "mbed.h" |
sunilaluri6 | 6:9044de9736a1 | 21 | #include "EthernetInterface.h" |
sunilaluri6 | 6:9044de9736a1 | 22 | #define ECHO_SERVER_PORT 7 // define the port which the clients can connect to |
sunilaluri6 | 6:9044de9736a1 | 23 | |
sunilaluri6 | 6:9044de9736a1 | 24 | // FetchCookies Class function is to , connect to a http web server and get the html header |
sunilaluri6 | 6:9044de9736a1 | 25 | // of the webiste, which contains Date and Set-Cookie fields. |
sunilaluri6 | 6:9044de9736a1 | 26 | class FetchCookies |
sunilaluri6 | 6:9044de9736a1 | 27 | { |
sunilaluri6 | 6:9044de9736a1 | 28 | private: |
sunilaluri6 | 6:9044de9736a1 | 29 | char buffer[300],*key,*date,*cookie,*client_message; |
sunilaluri6 | 6:9044de9736a1 | 30 | int ret; |
sunilaluri6 | 6:9044de9736a1 | 31 | TCPSocketConnection sock; //create a socket for TCP connection on the server |
sunilaluri6 | 6:9044de9736a1 | 32 | public: |
sunilaluri6 | 6:9044de9736a1 | 33 | FetchCookies() { // initiate all the pointers and buffers |
sunilaluri6 | 6:9044de9736a1 | 34 | ret=0; |
sunilaluri6 | 6:9044de9736a1 | 35 | buffer[0]='\0'; |
sunilaluri6 | 6:9044de9736a1 | 36 | key =0; |
sunilaluri6 | 6:9044de9736a1 | 37 | date=0; |
sunilaluri6 | 6:9044de9736a1 | 38 | cookie=0; |
sunilaluri6 | 6:9044de9736a1 | 39 | client_message=0; |
sunilaluri6 | 6:9044de9736a1 | 40 | } |
sunilaluri6 | 6:9044de9736a1 | 41 | ~FetchCookies() { // destructor that frees the memory allocated |
sunilaluri6 | 6:9044de9736a1 | 42 | free(client_message); |
sunilaluri6 | 6:9044de9736a1 | 43 | } |
sunilaluri6 | 6:9044de9736a1 | 44 | |
sunilaluri6 | 6:9044de9736a1 | 45 | |
sunilaluri6 | 6:9044de9736a1 | 46 | // getCookie method, connects to a website and requests header. It fetches the date and cookie |
sunilaluri6 | 6:9044de9736a1 | 47 | // part of the received header and sends out the information to the caller function. |
sunilaluri6 | 6:9044de9736a1 | 48 | char* getCookie () { |
sunilaluri6 | 6:9044de9736a1 | 49 | sock.connect("google.com", 80); // connect to the webserver |
sunilaluri6 | 6:9044de9736a1 | 50 | //send the HEAD cmd to request header of the webpage |
sunilaluri6 | 6:9044de9736a1 | 51 | char http_cmd[] = "HEAD http://www.google.com/ HTTP/1.0\r\n\r\n"; |
sunilaluri6 | 6:9044de9736a1 | 52 | sock.send_all(http_cmd, sizeof(http_cmd)-1); |
sunilaluri6 | 6:9044de9736a1 | 53 | // receive the information from web server |
sunilaluri6 | 6:9044de9736a1 | 54 | ret = sock.receive(buffer, sizeof(buffer)-1); |
sunilaluri6 | 6:9044de9736a1 | 55 | // using strtok function, fetch for date and cookie part of header, which are |
sunilaluri6 | 6:9044de9736a1 | 56 | //delimited by \n charecter |
sunilaluri6 | 6:9044de9736a1 | 57 | if (ret > 0) { |
sunilaluri6 | 6:9044de9736a1 | 58 | buffer[ret] = '\0'; |
sunilaluri6 | 6:9044de9736a1 | 59 | key = strtok(buffer,"\n"); |
sunilaluri6 | 6:9044de9736a1 | 60 | date = strtok(NULL,"\n"); |
sunilaluri6 | 6:9044de9736a1 | 61 | while(key!=NULL) { |
sunilaluri6 | 6:9044de9736a1 | 62 | key=strtok(NULL,"\n"); |
sunilaluri6 | 6:9044de9736a1 | 63 | if(strstr(key,"Set")==NULL) { |
sunilaluri6 | 6:9044de9736a1 | 64 | continue; |
sunilaluri6 | 6:9044de9736a1 | 65 | } else { |
sunilaluri6 | 6:9044de9736a1 | 66 | cookie =key; |
sunilaluri6 | 6:9044de9736a1 | 67 | break; |
sunilaluri6 | 6:9044de9736a1 | 68 | } |
sunilaluri6 | 6:9044de9736a1 | 69 | } |
sunilaluri6 | 6:9044de9736a1 | 70 | // for string concatenation, assign memory |
sunilaluri6 | 6:9044de9736a1 | 71 | client_message = (char*)malloc(strlen(date)+strlen(cookie)+1); |
sunilaluri6 | 6:9044de9736a1 | 72 | // copy the date and cookie info into the message pointer |
sunilaluri6 | 6:9044de9736a1 | 73 | sprintf(client_message,"%s\r\n%s",date,cookie); |
sunilaluri6 | 6:9044de9736a1 | 74 | } |
sunilaluri6 | 6:9044de9736a1 | 75 | //close the webserver connection |
sunilaluri6 | 6:9044de9736a1 | 76 | sock.close(); |
sunilaluri6 | 6:9044de9736a1 | 77 | // send the TCP client message pointer. |
sunilaluri6 | 6:9044de9736a1 | 78 | return(client_message); |
sunilaluri6 | 6:9044de9736a1 | 79 | } |
sunilaluri6 | 6:9044de9736a1 | 80 | }; |
sunilaluri6 | 6:9044de9736a1 | 81 | |
sunilaluri6 | 6:9044de9736a1 | 82 | |
sunilaluri6 | 6:9044de9736a1 | 83 | int main (void) |
sunilaluri6 | 6:9044de9736a1 | 84 | { |
sunilaluri6 | 6:9044de9736a1 | 85 | /**** ether net interface definition begin *****/ |
sunilaluri6 | 6:9044de9736a1 | 86 | EthernetInterface eth; |
sunilaluri6 | 6:9044de9736a1 | 87 | eth.init(); //Use DHCP |
sunilaluri6 | 6:9044de9736a1 | 88 | eth.connect(); |
sunilaluri6 | 6:9044de9736a1 | 89 | /**** ethernet interface definition end*******/ |
sunilaluri6 | 6:9044de9736a1 | 90 | FetchCookies FC; // create an object for Fetch Cookies class |
sunilaluri6 | 6:9044de9736a1 | 91 | printf("\r\nIP Address is %s\n", eth.getIPAddress()); //print the server IP address |
sunilaluri6 | 6:9044de9736a1 | 92 | TCPSocketServer server; //create a socket for server to listen to requests |
sunilaluri6 | 6:9044de9736a1 | 93 | server.bind(ECHO_SERVER_PORT); // bind the port to server |
sunilaluri6 | 6:9044de9736a1 | 94 | server.listen(); //listen for client requests |
sunilaluri6 | 6:9044de9736a1 | 95 | char *client_info=0; |
sunilaluri6 | 6:9044de9736a1 | 96 | //the following loop, listens for new connections, make them and send the response message to clients |
sunilaluri6 | 6:9044de9736a1 | 97 | while (true) { |
sunilaluri6 | 6:9044de9736a1 | 98 | printf("\r\nWait for new connection...\r\n"); |
sunilaluri6 | 6:9044de9736a1 | 99 | TCPSocketConnection client; |
sunilaluri6 | 6:9044de9736a1 | 100 | |
sunilaluri6 | 6:9044de9736a1 | 101 | server.accept(client); // accept the incoming connection |
sunilaluri6 | 6:9044de9736a1 | 102 | client.set_blocking(false, 5500); // Timeout after (1.5)s |
sunilaluri6 | 6:9044de9736a1 | 103 | client_info =FC.getCookie(); // fetch new cookie and date from webservers |
sunilaluri6 | 6:9044de9736a1 | 104 | printf("Connection from: %s\r\n", client.get_address()); |
sunilaluri6 | 6:9044de9736a1 | 105 | if(client_info == 0) // if no message was obtained, quit and start for new client connection |
sunilaluri6 | 6:9044de9736a1 | 106 | break; |
sunilaluri6 | 6:9044de9736a1 | 107 | printf("Sending Data to client...\r\n"); // if webserver gives the cookies, send them to client. |
sunilaluri6 | 6:9044de9736a1 | 108 | client.send_all(client_info,strlen(client_info)); |
sunilaluri6 | 6:9044de9736a1 | 109 | wait(5); |
sunilaluri6 | 6:9044de9736a1 | 110 | printf("Closing connection\r\n"); // after sending the message, close the connection |
sunilaluri6 | 6:9044de9736a1 | 111 | client.close(); |
sunilaluri6 | 6:9044de9736a1 | 112 | } |
sunilaluri6 | 6:9044de9736a1 | 113 | |
sunilaluri6 | 6:9044de9736a1 | 114 | } |
sunilaluri6 | 6:9044de9736a1 | 115 | |
sunilaluri6 | 6:9044de9736a1 | 116 |