TCPTest Server attempt
Dependencies: EthernetNetIf mbed
main.cpp@1:7785624d8f35, 2011-03-15 (annotated)
- Committer:
- OTBsolar
- Date:
- Tue Mar 15 16:08:17 2011 +0000
- Revision:
- 1:7785624d8f35
- Parent:
- 0:f8aba92e4c46
slightly less beta
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
OTBsolar | 0:f8aba92e4c46 | 1 | #include "mbed.h" |
OTBsolar | 0:f8aba92e4c46 | 2 | #include "EthernetNetIf.h" |
OTBsolar | 0:f8aba92e4c46 | 3 | #include "TCPSocket.h" |
OTBsolar | 0:f8aba92e4c46 | 4 | |
OTBsolar | 0:f8aba92e4c46 | 5 | EthernetNetIf eth; |
OTBsolar | 0:f8aba92e4c46 | 6 | DigitalOut led1(LED1); |
OTBsolar | 0:f8aba92e4c46 | 7 | |
OTBsolar | 0:f8aba92e4c46 | 8 | |
OTBsolar | 0:f8aba92e4c46 | 9 | TCPSocket tcp; //The listening port where requests are queued |
OTBsolar | 0:f8aba92e4c46 | 10 | TCPSocket* link; //The port where accepted requests can communicate |
OTBsolar | 0:f8aba92e4c46 | 11 | |
OTBsolar | 1:7785624d8f35 | 12 | Host local(IpAddr(130,144,2,83), 12345); //mbed IP |
OTBsolar | 1:7785624d8f35 | 13 | Host client; |
OTBsolar | 1:7785624d8f35 | 14 | |
OTBsolar | 1:7785624d8f35 | 15 | TCPSocketErr accErr; |
OTBsolar | 1:7785624d8f35 | 16 | |
OTBsolar | 1:7785624d8f35 | 17 | void onLinkSocketEvent(TCPSocketEvent e) |
OTBsolar | 1:7785624d8f35 | 18 | { |
OTBsolar | 1:7785624d8f35 | 19 | switch(e) |
OTBsolar | 1:7785624d8f35 | 20 | { |
OTBsolar | 1:7785624d8f35 | 21 | case TCPSOCKET_CONNECTED: |
OTBsolar | 1:7785624d8f35 | 22 | printf("TCP Socket Connected\r\n"); |
OTBsolar | 1:7785624d8f35 | 23 | break; |
OTBsolar | 1:7785624d8f35 | 24 | case TCPSOCKET_WRITEABLE: |
OTBsolar | 1:7785624d8f35 | 25 | //Can now write some data... |
OTBsolar | 1:7785624d8f35 | 26 | printf("TCP Socket Writable\r\n"); |
OTBsolar | 1:7785624d8f35 | 27 | break; |
OTBsolar | 1:7785624d8f35 | 28 | case TCPSOCKET_READABLE: |
OTBsolar | 1:7785624d8f35 | 29 | //Can now read dome data... |
OTBsolar | 1:7785624d8f35 | 30 | printf("TCP Socket Readable\r\n"); |
OTBsolar | 1:7785624d8f35 | 31 | // Read in any available data into the buffer |
OTBsolar | 1:7785624d8f35 | 32 | char buff[128]; |
OTBsolar | 1:7785624d8f35 | 33 | while ( int len = link->recv(buff, 128) ) { |
OTBsolar | 1:7785624d8f35 | 34 | // And send straight back out again |
OTBsolar | 1:7785624d8f35 | 35 | link->send(buff, len); |
OTBsolar | 1:7785624d8f35 | 36 | buff[len]=0; // make terminater |
OTBsolar | 1:7785624d8f35 | 37 | printf("Received&Wrote:%s\r\n",buff); |
OTBsolar | 1:7785624d8f35 | 38 | } |
OTBsolar | 1:7785624d8f35 | 39 | break; |
OTBsolar | 1:7785624d8f35 | 40 | case TCPSOCKET_CONTIMEOUT: |
OTBsolar | 1:7785624d8f35 | 41 | printf("TCP Socket Timeout\r\n"); |
OTBsolar | 1:7785624d8f35 | 42 | break; |
OTBsolar | 1:7785624d8f35 | 43 | case TCPSOCKET_CONRST: |
OTBsolar | 1:7785624d8f35 | 44 | printf("TCP Socket CONRST\r\n"); |
OTBsolar | 1:7785624d8f35 | 45 | break; |
OTBsolar | 1:7785624d8f35 | 46 | case TCPSOCKET_CONABRT: |
OTBsolar | 1:7785624d8f35 | 47 | printf("TCP Socket CONABRT\r\n"); |
OTBsolar | 1:7785624d8f35 | 48 | break; |
OTBsolar | 1:7785624d8f35 | 49 | case TCPSOCKET_ERROR: |
OTBsolar | 1:7785624d8f35 | 50 | printf("TCP Socket Error\r\n"); |
OTBsolar | 1:7785624d8f35 | 51 | break; |
OTBsolar | 1:7785624d8f35 | 52 | case TCPSOCKET_DISCONNECTED: |
OTBsolar | 1:7785624d8f35 | 53 | //Close socket... |
OTBsolar | 1:7785624d8f35 | 54 | printf("TCP Socket Disconnected\r\n"); |
OTBsolar | 1:7785624d8f35 | 55 | link->close(); |
OTBsolar | 1:7785624d8f35 | 56 | break; |
OTBsolar | 1:7785624d8f35 | 57 | default: |
OTBsolar | 1:7785624d8f35 | 58 | printf("DEFAULT\r\n"); |
OTBsolar | 1:7785624d8f35 | 59 | } |
OTBsolar | 1:7785624d8f35 | 60 | } |
OTBsolar | 1:7785624d8f35 | 61 | |
OTBsolar | 0:f8aba92e4c46 | 62 | void onTCPSocketEvent(TCPSocketEvent e) |
OTBsolar | 0:f8aba92e4c46 | 63 | { |
OTBsolar | 1:7785624d8f35 | 64 | switch(e) { |
OTBsolar | 0:f8aba92e4c46 | 65 | case TCPSOCKET_CONNECTED: |
OTBsolar | 0:f8aba92e4c46 | 66 | printf("Connected\n"); |
OTBsolar | 0:f8aba92e4c46 | 67 | break; |
OTBsolar | 0:f8aba92e4c46 | 68 | |
OTBsolar | 1:7785624d8f35 | 69 | case TCPSOCKET_ACCEPT: { |
OTBsolar | 1:7785624d8f35 | 70 | accErr = tcp.accept(&client,&link); |
OTBsolar | 1:7785624d8f35 | 71 | switch(accErr) { |
OTBsolar | 1:7785624d8f35 | 72 | case TCPSOCKET_SETUP: printf("Err:Setup\n"); break; //TCPSocket not properly configured. |
OTBsolar | 1:7785624d8f35 | 73 | case TCPSOCKET_TIMEOUT: printf("Err:Timeout\n"); break; //Connection timed out. |
OTBsolar | 1:7785624d8f35 | 74 | case TCPSOCKET_IF: printf("Err:Interface\n"); break; //Interface has problems, does not exist or is not initialized. |
OTBsolar | 1:7785624d8f35 | 75 | case TCPSOCKET_MEM: printf("Err:Memory\n"); break; //Not enough mem. |
OTBsolar | 1:7785624d8f35 | 76 | case TCPSOCKET_INUSE: printf("Err:In use\n"); break; //Interface / Port is in use. |
OTBsolar | 1:7785624d8f35 | 77 | case TCPSOCKET_EMPTY: printf("Err:Empty\n"); break; //Connections queue is empty. |
OTBsolar | 1:7785624d8f35 | 78 | case TCPSOCKET_RST: printf("Err:Reset\n"); break; //Connection was reset by remote host. |
OTBsolar | 1:7785624d8f35 | 79 | case TCPSOCKET_OK: printf("Accepted: "); break; //Success. |
OTBsolar | 1:7785624d8f35 | 80 | } |
OTBsolar | 1:7785624d8f35 | 81 | link->setOnEvent(&onLinkSocketEvent); |
OTBsolar | 1:7785624d8f35 | 82 | IpAddr clientIp = client.getIp(); |
OTBsolar | 1:7785624d8f35 | 83 | printf("Incoming TCP connection from %d.%d.%d.%d\r\n", |
OTBsolar | 1:7785624d8f35 | 84 | clientIp[0], clientIp[1], clientIp[2], clientIp[3]); |
OTBsolar | 1:7785624d8f35 | 85 | } |
OTBsolar | 0:f8aba92e4c46 | 86 | break; |
OTBsolar | 0:f8aba92e4c46 | 87 | |
OTBsolar | 0:f8aba92e4c46 | 88 | case TCPSOCKET_READABLE: |
OTBsolar | 0:f8aba92e4c46 | 89 | printf("Readable\n"); |
OTBsolar | 0:f8aba92e4c46 | 90 | break; |
OTBsolar | 0:f8aba92e4c46 | 91 | |
OTBsolar | 0:f8aba92e4c46 | 92 | case TCPSOCKET_WRITEABLE: |
OTBsolar | 0:f8aba92e4c46 | 93 | printf("Writeable\n"); |
OTBsolar | 0:f8aba92e4c46 | 94 | break; |
OTBsolar | 0:f8aba92e4c46 | 95 | |
OTBsolar | 0:f8aba92e4c46 | 96 | case TCPSOCKET_CONTIMEOUT: |
OTBsolar | 0:f8aba92e4c46 | 97 | printf("Timeout\n"); |
OTBsolar | 0:f8aba92e4c46 | 98 | break; |
OTBsolar | 0:f8aba92e4c46 | 99 | |
OTBsolar | 0:f8aba92e4c46 | 100 | case TCPSOCKET_CONRST: |
OTBsolar | 0:f8aba92e4c46 | 101 | printf("Reset\n"); |
OTBsolar | 0:f8aba92e4c46 | 102 | break; |
OTBsolar | 0:f8aba92e4c46 | 103 | case TCPSOCKET_CONABRT: |
OTBsolar | 0:f8aba92e4c46 | 104 | printf("Aborted\n"); |
OTBsolar | 0:f8aba92e4c46 | 105 | break; |
OTBsolar | 0:f8aba92e4c46 | 106 | |
OTBsolar | 0:f8aba92e4c46 | 107 | case TCPSOCKET_ERROR: |
OTBsolar | 0:f8aba92e4c46 | 108 | printf("Error\n"); |
OTBsolar | 0:f8aba92e4c46 | 109 | break; |
OTBsolar | 0:f8aba92e4c46 | 110 | |
OTBsolar | 0:f8aba92e4c46 | 111 | case TCPSOCKET_DISCONNECTED: |
OTBsolar | 0:f8aba92e4c46 | 112 | printf("Disconnected\n"); |
OTBsolar | 0:f8aba92e4c46 | 113 | tcp.close(); |
OTBsolar | 0:f8aba92e4c46 | 114 | break; |
OTBsolar | 0:f8aba92e4c46 | 115 | } |
OTBsolar | 0:f8aba92e4c46 | 116 | } |
OTBsolar | 0:f8aba92e4c46 | 117 | |
OTBsolar | 0:f8aba92e4c46 | 118 | int main() { |
OTBsolar | 0:f8aba92e4c46 | 119 | //********Basic setup******** |
OTBsolar | 0:f8aba92e4c46 | 120 | printf("Welcome to wireFUSE\n"); |
OTBsolar | 0:f8aba92e4c46 | 121 | printf("Setting up...\n"); |
OTBsolar | 0:f8aba92e4c46 | 122 | EthernetErr ethErr = eth.setup(); |
OTBsolar | 0:f8aba92e4c46 | 123 | if(ethErr) |
OTBsolar | 0:f8aba92e4c46 | 124 | { |
OTBsolar | 0:f8aba92e4c46 | 125 | printf("Error %d in setup.\n", ethErr); |
OTBsolar | 0:f8aba92e4c46 | 126 | return -1; |
OTBsolar | 0:f8aba92e4c46 | 127 | } |
OTBsolar | 0:f8aba92e4c46 | 128 | printf("Setup OK\n"); |
OTBsolar | 0:f8aba92e4c46 | 129 | //****End of basic setup***** |
OTBsolar | 0:f8aba92e4c46 | 130 | |
OTBsolar | 1:7785624d8f35 | 131 | tcp.setOnEvent(&onTCPSocketEvent); //Generate method to deal with requests |
OTBsolar | 1:7785624d8f35 | 132 | |
OTBsolar | 1:7785624d8f35 | 133 | //Bind to local port |
OTBsolar | 1:7785624d8f35 | 134 | printf("Init bind..\n"); |
OTBsolar | 1:7785624d8f35 | 135 | TCPSocketErr bindErr = tcp.bind(local); |
OTBsolar | 1:7785624d8f35 | 136 | switch(bindErr) { |
OTBsolar | 1:7785624d8f35 | 137 | case TCPSOCKET_SETUP: printf("Err:Setup\n"); break; //TCPSocket not properly configured. |
OTBsolar | 1:7785624d8f35 | 138 | case TCPSOCKET_TIMEOUT: printf("Err:Timeout\n"); break; //Connection timed out. |
OTBsolar | 1:7785624d8f35 | 139 | case TCPSOCKET_IF: printf("Err:Interface\n"); break; //Interface has problems, does not exist or is not initialized. |
OTBsolar | 1:7785624d8f35 | 140 | case TCPSOCKET_MEM: printf("Err:Memory\n"); break; //Not enough mem. |
OTBsolar | 1:7785624d8f35 | 141 | case TCPSOCKET_INUSE: printf("Err:In use\n"); break; //Interface / Port is in use. |
OTBsolar | 1:7785624d8f35 | 142 | case TCPSOCKET_EMPTY: printf("Err:Empty\n"); break; //Connections queue is empty. |
OTBsolar | 1:7785624d8f35 | 143 | case TCPSOCKET_RST: printf("Err:Reset\n"); break; //Connection was reset by remote host. |
OTBsolar | 1:7785624d8f35 | 144 | case TCPSOCKET_OK: printf("Bound to port\n"); break; //Success. |
OTBsolar | 1:7785624d8f35 | 145 | } |
OTBsolar | 1:7785624d8f35 | 146 | |
OTBsolar | 1:7785624d8f35 | 147 | //Listen to local port |
OTBsolar | 1:7785624d8f35 | 148 | printf("Init listen..\n"); |
OTBsolar | 1:7785624d8f35 | 149 | TCPSocketErr listenErr = tcp.listen(); |
OTBsolar | 1:7785624d8f35 | 150 | switch(listenErr) { |
OTBsolar | 1:7785624d8f35 | 151 | case TCPSOCKET_SETUP: printf("Err:Setup\n"); break; //TCPSocket not properly configured. |
OTBsolar | 1:7785624d8f35 | 152 | case TCPSOCKET_TIMEOUT: printf("Err:Timeout\n"); break; //Connection timed out. |
OTBsolar | 1:7785624d8f35 | 153 | case TCPSOCKET_IF: printf("Err:Interface\n"); break; //Interface has problems, does not exist or is not initialized. |
OTBsolar | 1:7785624d8f35 | 154 | case TCPSOCKET_MEM: printf("Err:Memory\n"); break; //Not enough mem. |
OTBsolar | 1:7785624d8f35 | 155 | case TCPSOCKET_INUSE: printf("Err:In use\n"); break; //Interface / Port is in use. |
OTBsolar | 1:7785624d8f35 | 156 | case TCPSOCKET_EMPTY: printf("Err:Empty\n"); break; //Connections queue is empty. |
OTBsolar | 1:7785624d8f35 | 157 | case TCPSOCKET_RST: printf("Err:Reset\n"); break; //Connection was reset by remote host. |
OTBsolar | 1:7785624d8f35 | 158 | case TCPSOCKET_OK: printf("Listening\n"); break; //Success. |
OTBsolar | 1:7785624d8f35 | 159 | } |
OTBsolar | 0:f8aba92e4c46 | 160 | Timer tmr; |
OTBsolar | 0:f8aba92e4c46 | 161 | tmr.start(); |
OTBsolar | 1:7785624d8f35 | 162 | while(1) |
OTBsolar | 0:f8aba92e4c46 | 163 | { |
OTBsolar | 0:f8aba92e4c46 | 164 | Net::poll(); |
OTBsolar | 0:f8aba92e4c46 | 165 | if(tmr.read() > 2) |
OTBsolar | 0:f8aba92e4c46 | 166 | { |
OTBsolar | 0:f8aba92e4c46 | 167 | tmr.reset(); |
OTBsolar | 0:f8aba92e4c46 | 168 | led1=!led1; //Show that we are alive |
OTBsolar | 0:f8aba92e4c46 | 169 | |
OTBsolar | 0:f8aba92e4c46 | 170 | //Wait for a connection request |
OTBsolar | 1:7785624d8f35 | 171 | printf("waiting for client on port 12345\n"); |
OTBsolar | 0:f8aba92e4c46 | 172 | } |
OTBsolar | 0:f8aba92e4c46 | 173 | } |
OTBsolar | 0:f8aba92e4c46 | 174 | } |