Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:d3cd3a4b962c, 2021-04-08 (annotated)
- Committer:
- YSI
- Date:
- Thu Apr 08 12:39:50 2021 +0000
- Revision:
- 0:d3cd3a4b962c
TCP-Server-sample
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| YSI | 0:d3cd3a4b962c | 1 | #include "main.h" |
| YSI | 0:d3cd3a4b962c | 2 | |
| YSI | 0:d3cd3a4b962c | 3 | int main() |
| YSI | 0:d3cd3a4b962c | 4 | { |
| YSI | 0:d3cd3a4b962c | 5 | Led = eth_status; |
| YSI | 0:d3cd3a4b962c | 6 | queue = mbed_event_queue(); |
| YSI | 0:d3cd3a4b962c | 7 | while(1) if(eth_connect()) Led = recv(); |
| YSI | 0:d3cd3a4b962c | 8 | } |
| YSI | 0:d3cd3a4b962c | 9 | |
| YSI | 0:d3cd3a4b962c | 10 | bool eth_connect(void) |
| YSI | 0:d3cd3a4b962c | 11 | { |
| YSI | 0:d3cd3a4b962c | 12 | switch(eth.get_connection_status()) |
| YSI | 0:d3cd3a4b962c | 13 | { |
| YSI | 0:d3cd3a4b962c | 14 | case NSAPI_STATUS_DISCONNECTED: |
| YSI | 0:d3cd3a4b962c | 15 | eth.set_blocking(false); |
| YSI | 0:d3cd3a4b962c | 16 | eth.set_network(SocketAddress(IP_SERVER), SocketAddress("255.255.255.0"), SocketAddress("192.168.1.1")); // if not static eth.set_dhcp(true); |
| YSI | 0:d3cd3a4b962c | 17 | eth.attach(callback(ð_event)); |
| YSI | 0:d3cd3a4b962c | 18 | eth.connect(); break; |
| YSI | 0:d3cd3a4b962c | 19 | case NSAPI_STATUS_GLOBAL_UP: return CONNECT; break; |
| YSI | 0:d3cd3a4b962c | 20 | default: break; |
| YSI | 0:d3cd3a4b962c | 21 | } |
| YSI | 0:d3cd3a4b962c | 22 | return false; |
| YSI | 0:d3cd3a4b962c | 23 | } |
| YSI | 0:d3cd3a4b962c | 24 | |
| YSI | 0:d3cd3a4b962c | 25 | void eth_event(nsapi_event_t status, intptr_t param) |
| YSI | 0:d3cd3a4b962c | 26 | { |
| YSI | 0:d3cd3a4b962c | 27 | switch(param) |
| YSI | 0:d3cd3a4b962c | 28 | { |
| YSI | 0:d3cd3a4b962c | 29 | case NSAPI_STATUS_DISCONNECTED: eth_status = RED_DISCONNECTED; break; |
| YSI | 0:d3cd3a4b962c | 30 | case NSAPI_STATUS_CONNECTING:if(eth_status == BLUE_CLIENT) clientTCP->close(); |
| YSI | 0:d3cd3a4b962c | 31 | eth_status = YELLOW_CONNECTING; break; |
| YSI | 0:d3cd3a4b962c | 32 | case NSAPI_STATUS_GLOBAL_UP: eth_status = GREEN_GLOBAL_UP; |
| YSI | 0:d3cd3a4b962c | 33 | if(!CONNECT) serverTCP_connect(); |
| YSI | 0:d3cd3a4b962c | 34 | else serverTCP_event(); break; |
| YSI | 0:d3cd3a4b962c | 35 | default: break; |
| YSI | 0:d3cd3a4b962c | 36 | } |
| YSI | 0:d3cd3a4b962c | 37 | } |
| YSI | 0:d3cd3a4b962c | 38 | |
| YSI | 0:d3cd3a4b962c | 39 | void eth_state(void) |
| YSI | 0:d3cd3a4b962c | 40 | { |
| YSI | 0:d3cd3a4b962c | 41 | switch(eth.get_connection_status()) |
| YSI | 0:d3cd3a4b962c | 42 | { |
| YSI | 0:d3cd3a4b962c | 43 | case NSAPI_STATUS_DISCONNECTED: eth_status = RED_DISCONNECTED; break; |
| YSI | 0:d3cd3a4b962c | 44 | case NSAPI_STATUS_CONNECTING: eth_status = YELLOW_CONNECTING; break; |
| YSI | 0:d3cd3a4b962c | 45 | case NSAPI_STATUS_GLOBAL_UP: eth_status = GREEN_GLOBAL_UP; break; |
| YSI | 0:d3cd3a4b962c | 46 | default: break; |
| YSI | 0:d3cd3a4b962c | 47 | } |
| YSI | 0:d3cd3a4b962c | 48 | } |
| YSI | 0:d3cd3a4b962c | 49 | |
| YSI | 0:d3cd3a4b962c | 50 | bool serverTCP_connect(void) |
| YSI | 0:d3cd3a4b962c | 51 | { |
| YSI | 0:d3cd3a4b962c | 52 | if(!CONNECT) |
| YSI | 0:d3cd3a4b962c | 53 | if(serverTCP.open(ð) == NSAPI_ERROR_OK) |
| YSI | 0:d3cd3a4b962c | 54 | if(serverTCP.bind(PORT_SERVER) == NSAPI_ERROR_OK) |
| YSI | 0:d3cd3a4b962c | 55 | if(serverTCP.listen() == NSAPI_ERROR_OK) |
| YSI | 0:d3cd3a4b962c | 56 | { |
| YSI | 0:d3cd3a4b962c | 57 | serverTCP.set_blocking(false); |
| YSI | 0:d3cd3a4b962c | 58 | serverTCP.sigio(callback(&serverTCP_event)); |
| YSI | 0:d3cd3a4b962c | 59 | CONNECT = true; |
| YSI | 0:d3cd3a4b962c | 60 | } |
| YSI | 0:d3cd3a4b962c | 61 | return CONNECT; |
| YSI | 0:d3cd3a4b962c | 62 | } |
| YSI | 0:d3cd3a4b962c | 63 | |
| YSI | 0:d3cd3a4b962c | 64 | void serverTCP_event(void) |
| YSI | 0:d3cd3a4b962c | 65 | { |
| YSI | 0:d3cd3a4b962c | 66 | queue->call(&serverTCP_accept); |
| YSI | 0:d3cd3a4b962c | 67 | } |
| YSI | 0:d3cd3a4b962c | 68 | |
| YSI | 0:d3cd3a4b962c | 69 | void serverTCP_accept(void) |
| YSI | 0:d3cd3a4b962c | 70 | { |
| YSI | 0:d3cd3a4b962c | 71 | if(eth_status == GREEN_GLOBAL_UP) |
| YSI | 0:d3cd3a4b962c | 72 | { |
| YSI | 0:d3cd3a4b962c | 73 | nsapi_error_t ack = NSAPI_ERROR_WOULD_BLOCK; |
| YSI | 0:d3cd3a4b962c | 74 | eth_status = MAGENTA_ACCEPT; |
| YSI | 0:d3cd3a4b962c | 75 | clientTCP = serverTCP.accept(&ack); |
| YSI | 0:d3cd3a4b962c | 76 | switch(ack) |
| YSI | 0:d3cd3a4b962c | 77 | { |
| YSI | 0:d3cd3a4b962c | 78 | case NSAPI_ERROR_OK: |
| YSI | 0:d3cd3a4b962c | 79 | clientTCP->set_timeout(TIMEOUT_SERVER); // config client bloquante avec timeout sinon limite de transmission a 1072 octets |
| YSI | 0:d3cd3a4b962c | 80 | eth_status = BLUE_CLIENT; |
| YSI | 0:d3cd3a4b962c | 81 | break; |
| YSI | 0:d3cd3a4b962c | 82 | case NSAPI_ERROR_NO_CONNECTION: |
| YSI | 0:d3cd3a4b962c | 83 | eth_state(); |
| YSI | 0:d3cd3a4b962c | 84 | serverTCP_event(); |
| YSI | 0:d3cd3a4b962c | 85 | break; |
| YSI | 0:d3cd3a4b962c | 86 | default: |
| YSI | 0:d3cd3a4b962c | 87 | eth_state(); |
| YSI | 0:d3cd3a4b962c | 88 | break; |
| YSI | 0:d3cd3a4b962c | 89 | } |
| YSI | 0:d3cd3a4b962c | 90 | } |
| YSI | 0:d3cd3a4b962c | 91 | } |
| YSI | 0:d3cd3a4b962c | 92 | |
| YSI | 0:d3cd3a4b962c | 93 | enum_status recv(void) |
| YSI | 0:d3cd3a4b962c | 94 | { |
| YSI | 0:d3cd3a4b962c | 95 | if(eth_connect() && (eth_status == BLUE_CLIENT)) |
| YSI | 0:d3cd3a4b962c | 96 | { |
| YSI | 0:d3cd3a4b962c | 97 | char buffer[BUFFER_SIZE] = {0}; |
| YSI | 0:d3cd3a4b962c | 98 | nsapi_error_t ack = NSAPI_ERROR_WOULD_BLOCK, size = 0; |
| YSI | 0:d3cd3a4b962c | 99 | while((ack = clientTCP->recv(&buffer[size], BUFFER_SIZE-size)) > NSAPI_ERROR_OK) size += ack; |
| YSI | 0:d3cd3a4b962c | 100 | if(!size && (ack == NSAPI_ERROR_OK) || (ack == NSAPI_ERROR_NO_CONNECTION)) |
| YSI | 0:d3cd3a4b962c | 101 | { |
| YSI | 0:d3cd3a4b962c | 102 | clientTCP->close(); |
| YSI | 0:d3cd3a4b962c | 103 | eth_state(); |
| YSI | 0:d3cd3a4b962c | 104 | serverTCP_event(); |
| YSI | 0:d3cd3a4b962c | 105 | } |
| YSI | 0:d3cd3a4b962c | 106 | if(size) |
| YSI | 0:d3cd3a4b962c | 107 | { |
| YSI | 0:d3cd3a4b962c | 108 | string cmd(buffer); |
| YSI | 0:d3cd3a4b962c | 109 | for(char &c : cmd) if((c >= 'a') && (c <= 'z')) c += 'A'-'a'; |
| YSI | 0:d3cd3a4b962c | 110 | if(!cmd.empty()) |
| YSI | 0:d3cd3a4b962c | 111 | { |
| YSI | 0:d3cd3a4b962c | 112 | ostringstream ssend; |
| YSI | 0:d3cd3a4b962c | 113 | if(cmd.find("GET / HTTP") != string::npos) |
| YSI | 0:d3cd3a4b962c | 114 | { |
| YSI | 0:d3cd3a4b962c | 115 | ssend << "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nAccess-Control-Allow-Origin: *\r\n\r\n"; |
| YSI | 0:d3cd3a4b962c | 116 | ssend << "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>" << MBED_PROJECT << "</title>\r\n\t\t<meta http-equiv=refresh content=10>\r\n\t</head>"; |
| YSI | 0:d3cd3a4b962c | 117 | ssend << "\r\n\t<body style=background-color:dimgray>\r\n\t\t<center>\r\n\t\t\t<h1>" << MBED_PROJECT << "</h1>\r\n\t\t</center>\r\n\t</body>\r\n</html>"; |
| YSI | 0:d3cd3a4b962c | 118 | } |
| YSI | 0:d3cd3a4b962c | 119 | else ssend << "HTTP/1.1 204 No Content\r\n"; |
| YSI | 0:d3cd3a4b962c | 120 | send(ssend.str()); |
| YSI | 0:d3cd3a4b962c | 121 | } |
| YSI | 0:d3cd3a4b962c | 122 | } |
| YSI | 0:d3cd3a4b962c | 123 | } |
| YSI | 0:d3cd3a4b962c | 124 | return eth_status; |
| YSI | 0:d3cd3a4b962c | 125 | } |
| YSI | 0:d3cd3a4b962c | 126 | |
| YSI | 0:d3cd3a4b962c | 127 | nsapi_error_t send(const string& buff) |
| YSI | 0:d3cd3a4b962c | 128 | { |
| YSI | 0:d3cd3a4b962c | 129 | nsapi_error_t ack = NSAPI_ERROR_WOULD_BLOCK; |
| YSI | 0:d3cd3a4b962c | 130 | string ssend(buff+"\n"); |
| YSI | 0:d3cd3a4b962c | 131 | if((eth_status == BLUE_CLIENT) && !buff.empty()) |
| YSI | 0:d3cd3a4b962c | 132 | ack = clientTCP->send(ssend.c_str(), ssend.size()); |
| YSI | 0:d3cd3a4b962c | 133 | //------------------- HTTP request must close |
| YSI | 0:d3cd3a4b962c | 134 | clientTCP->close(); |
| YSI | 0:d3cd3a4b962c | 135 | eth_state(); |
| YSI | 0:d3cd3a4b962c | 136 | serverTCP_event(); |
| YSI | 0:d3cd3a4b962c | 137 | //------------------- |
| YSI | 0:d3cd3a4b962c | 138 | return ack; |
| YSI | 0:d3cd3a4b962c | 139 | } |