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.
http/server/HttpSocket.cpp@7:a069c1750fbc, 2015-07-05 (annotated)
- Committer:
- dflet
- Date:
- Sun Jul 05 22:18:04 2015 +0000
- Revision:
- 7:a069c1750fbc
- Parent:
- 6:37fb696395d7
- Child:
- 12:7d75ba5deed1
WIP commit 8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dflet | 0:50cedd586816 | 1 | //***************************************************************************** |
dflet | 0:50cedd586816 | 2 | // Copyright (C) 2014 Texas Instruments Incorporated |
dflet | 0:50cedd586816 | 3 | // |
dflet | 0:50cedd586816 | 4 | // All rights reserved. Property of Texas Instruments Incorporated. |
dflet | 0:50cedd586816 | 5 | // Restricted rights to use, duplicate or disclose this code are |
dflet | 0:50cedd586816 | 6 | // granted through contract. |
dflet | 0:50cedd586816 | 7 | // The program may not be used without the written permission of |
dflet | 0:50cedd586816 | 8 | // Texas Instruments Incorporated or against the terms and conditions |
dflet | 0:50cedd586816 | 9 | // stipulated in the agreement under which this program has been supplied, |
dflet | 0:50cedd586816 | 10 | // and under no circumstances can it be used with non-TI connectivity device. |
dflet | 0:50cedd586816 | 11 | // |
dflet | 0:50cedd586816 | 12 | //***************************************************************************** |
dflet | 0:50cedd586816 | 13 | |
dflet | 0:50cedd586816 | 14 | |
dflet | 0:50cedd586816 | 15 | /** |
dflet | 0:50cedd586816 | 16 | * @defgroup HttpSocket |
dflet | 0:50cedd586816 | 17 | * This module performs all HTTP socket operations |
dflet | 0:50cedd586816 | 18 | * |
dflet | 0:50cedd586816 | 19 | * @{ |
dflet | 0:50cedd586816 | 20 | */ |
dflet | 0:50cedd586816 | 21 | |
dflet | 0:50cedd586816 | 22 | #include <string.h> |
dflet | 0:50cedd586816 | 23 | #include "HttpDebug.h" |
dflet | 0:50cedd586816 | 24 | #include "HttpSocket.h" |
dflet | 0:50cedd586816 | 25 | #include "cc3100_simplelink.h" |
dflet | 0:50cedd586816 | 26 | #include "cc3100_socket.h" |
dflet | 0:50cedd586816 | 27 | |
dflet | 0:50cedd586816 | 28 | #include "osi.h" |
dflet | 0:50cedd586816 | 29 | |
dflet | 0:50cedd586816 | 30 | using namespace mbed_cc3100; |
dflet | 0:50cedd586816 | 31 | |
dflet | 0:50cedd586816 | 32 | cc3100 _cc3100_Module(NC, NC, PD_12, PD_13, PD_11, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck |
dflet | 0:50cedd586816 | 33 | |
dflet | 0:50cedd586816 | 34 | #define OSI_DELAY(x) osi_Sleep(x); //os idle |
dflet | 0:50cedd586816 | 35 | |
dflet | 0:50cedd586816 | 36 | int OpenTCPServerSocket(unsigned int uiPortNum) |
dflet | 0:50cedd586816 | 37 | { |
dflet | 0:50cedd586816 | 38 | int iSockDesc, iRetVal; |
dflet | 0:50cedd586816 | 39 | sockaddr_in sServerAddress; |
dflet | 0:50cedd586816 | 40 | SlSockNonblocking_t enableOption; |
dflet | 0:50cedd586816 | 41 | enableOption.NonblockingEnabled = 1; |
dflet | 0:50cedd586816 | 42 | |
dflet | 0:50cedd586816 | 43 | // |
dflet | 0:50cedd586816 | 44 | // opens a secure socket |
dflet | 0:50cedd586816 | 45 | // |
dflet | 0:50cedd586816 | 46 | if(443 == uiPortNum) |
dflet | 0:50cedd586816 | 47 | { |
dflet | 0:50cedd586816 | 48 | iSockDesc = _cc3100_Module._socket.sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET); |
dflet | 0:50cedd586816 | 49 | } |
dflet | 0:50cedd586816 | 50 | else //non secure |
dflet | 0:50cedd586816 | 51 | { |
dflet | 0:50cedd586816 | 52 | iSockDesc = _cc3100_Module._socket.sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_IPPROTO_TCP); |
dflet | 0:50cedd586816 | 53 | } |
dflet | 0:50cedd586816 | 54 | |
dflet | 0:50cedd586816 | 55 | if( iSockDesc < 0 ) |
dflet | 0:50cedd586816 | 56 | { |
dflet | 0:50cedd586816 | 57 | return -1; |
dflet | 0:50cedd586816 | 58 | } |
dflet | 0:50cedd586816 | 59 | //non blocking socket - Enable nonblocking mode |
dflet | 0:50cedd586816 | 60 | iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc,SOL_SOCKET,SL_SO_NONBLOCKING, &enableOption,sizeof(enableOption)); |
dflet | 0:50cedd586816 | 61 | if(iRetVal < 0) |
dflet | 0:50cedd586816 | 62 | { |
dflet | 0:50cedd586816 | 63 | CloseTCPServerSocket(iSockDesc); |
dflet | 0:50cedd586816 | 64 | return -1; |
dflet | 0:50cedd586816 | 65 | } |
dflet | 0:50cedd586816 | 66 | |
dflet | 0:50cedd586816 | 67 | if(443 == uiPortNum) |
dflet | 0:50cedd586816 | 68 | { |
dflet | 0:50cedd586816 | 69 | iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc, SL_SOL_SOCKET, SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME,SL_SSL_SRV_KEY, strlen(SL_SSL_SRV_KEY)); |
dflet | 0:50cedd586816 | 70 | if( iRetVal < 0 ) |
dflet | 0:50cedd586816 | 71 | { |
dflet | 0:50cedd586816 | 72 | CloseTCPServerSocket(iSockDesc); |
dflet | 0:50cedd586816 | 73 | return -1; |
dflet | 0:50cedd586816 | 74 | } |
dflet | 0:50cedd586816 | 75 | iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc, SL_SOL_SOCKET, SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME,SL_SSL_SRV_CERT, strlen(SL_SSL_SRV_CERT)); |
dflet | 0:50cedd586816 | 76 | if( iRetVal < 0 ) |
dflet | 0:50cedd586816 | 77 | { |
dflet | 0:50cedd586816 | 78 | CloseTCPServerSocket(iSockDesc); |
dflet | 0:50cedd586816 | 79 | return -1; |
dflet | 0:50cedd586816 | 80 | } |
dflet | 0:50cedd586816 | 81 | } |
dflet | 0:50cedd586816 | 82 | |
dflet | 0:50cedd586816 | 83 | // |
dflet | 0:50cedd586816 | 84 | // Bind - Assign a port to the socket |
dflet | 0:50cedd586816 | 85 | // |
dflet | 0:50cedd586816 | 86 | sServerAddress.sin_family = AF_INET; |
dflet | 0:50cedd586816 | 87 | sServerAddress.sin_addr.s_addr = _cc3100_Module._socket.htonl(INADDR_ANY); |
dflet | 0:50cedd586816 | 88 | sServerAddress.sin_port = _cc3100_Module._socket.htons(uiPortNum); |
dflet | 0:50cedd586816 | 89 | if ( _cc3100_Module._socket.bind(iSockDesc, (sockaddr*)&sServerAddress, sizeof(sServerAddress)) != 0 ) |
dflet | 0:50cedd586816 | 90 | { |
dflet | 0:50cedd586816 | 91 | CloseTCPServerSocket(iSockDesc); |
dflet | 0:50cedd586816 | 92 | return -1; |
dflet | 0:50cedd586816 | 93 | } |
dflet | 0:50cedd586816 | 94 | |
dflet | 0:50cedd586816 | 95 | return iSockDesc; |
dflet | 0:50cedd586816 | 96 | } |
dflet | 0:50cedd586816 | 97 | |
dflet | 0:50cedd586816 | 98 | int CreateTCPServerSocket(unsigned int uiPortNum) |
dflet | 0:50cedd586816 | 99 | { |
dflet | 0:50cedd586816 | 100 | int iSockDesc = -1; |
dflet | 0:50cedd586816 | 101 | unsigned char connectRetries = 0; |
dflet | 0:50cedd586816 | 102 | |
dflet | 0:50cedd586816 | 103 | while (connectRetries++ < SERVER_MAX_SETUP_RETRY_COUNT) |
dflet | 0:50cedd586816 | 104 | { |
dflet | 0:50cedd586816 | 105 | iSockDesc = OpenTCPServerSocket(uiPortNum); |
dflet | 0:50cedd586816 | 106 | |
dflet | 0:50cedd586816 | 107 | if (iSockDesc < 0) |
dflet | 0:50cedd586816 | 108 | { |
dflet | 0:50cedd586816 | 109 | continue; |
dflet | 0:50cedd586816 | 110 | } |
dflet | 0:50cedd586816 | 111 | |
dflet | 0:50cedd586816 | 112 | if(_cc3100_Module._socket.listen(iSockDesc, HTTP_CORE_MAX_CONNECTIONS) != 0) |
dflet | 0:50cedd586816 | 113 | { |
dflet | 0:50cedd586816 | 114 | CloseTCPServerSocket(iSockDesc); |
dflet | 0:50cedd586816 | 115 | iSockDesc = -1; |
dflet | 0:50cedd586816 | 116 | continue; |
dflet | 0:50cedd586816 | 117 | } |
dflet | 0:50cedd586816 | 118 | else |
dflet | 0:50cedd586816 | 119 | { |
dflet | 0:50cedd586816 | 120 | connectRetries = 0; |
dflet | 0:50cedd586816 | 121 | break; |
dflet | 0:50cedd586816 | 122 | } |
dflet | 0:50cedd586816 | 123 | } |
dflet | 0:50cedd586816 | 124 | |
dflet | 0:50cedd586816 | 125 | return iSockDesc; |
dflet | 0:50cedd586816 | 126 | } |
dflet | 0:50cedd586816 | 127 | |
dflet | 0:50cedd586816 | 128 | int CloseTCPServerSocket(int iSockDesc) |
dflet | 0:50cedd586816 | 129 | { |
dflet | 0:50cedd586816 | 130 | int ittr = 0; |
dflet | 0:50cedd586816 | 131 | |
dflet | 0:50cedd586816 | 132 | if(iSockDesc < 0) |
dflet | 0:50cedd586816 | 133 | { |
dflet | 0:50cedd586816 | 134 | return 0 ; |
dflet | 0:50cedd586816 | 135 | } |
dflet | 0:50cedd586816 | 136 | |
dflet | 0:50cedd586816 | 137 | do |
dflet | 0:50cedd586816 | 138 | { |
dflet | 0:50cedd586816 | 139 | if(_cc3100_Module._socket.sl_Close(iSockDesc) >= 0) |
dflet | 0:50cedd586816 | 140 | { |
dflet | 0:50cedd586816 | 141 | iSockDesc = -1; |
dflet | 0:50cedd586816 | 142 | HttpDebug("Http server socket closed\n\r"); |
dflet | 0:50cedd586816 | 143 | return 0; |
dflet | 0:50cedd586816 | 144 | } |
dflet | 0:50cedd586816 | 145 | else |
dflet | 0:50cedd586816 | 146 | { |
dflet | 0:50cedd586816 | 147 | HttpDebug("\n Http client socket close error\n\r"); |
dflet | 0:50cedd586816 | 148 | OSI_DELAY(500);//wait 500ms |
dflet | 0:50cedd586816 | 149 | } |
dflet | 0:50cedd586816 | 150 | ittr++; |
dflet | 0:50cedd586816 | 151 | }while(ittr < 3); |
dflet | 0:50cedd586816 | 152 | |
dflet | 0:50cedd586816 | 153 | return -1; |
dflet | 0:50cedd586816 | 154 | } |
dflet | 0:50cedd586816 | 155 | |
dflet | 0:50cedd586816 | 156 | int CreateTCPClientSocket(int iSockDesc) |
dflet | 0:50cedd586816 | 157 | { |
dflet | 0:50cedd586816 | 158 | sockaddr sClientAddr; |
dflet | 0:50cedd586816 | 159 | SlSocklen_t uiClientAddrLen = sizeof(sClientAddr); |
dflet | 0:50cedd586816 | 160 | int sock = -1; |
dflet | 0:50cedd586816 | 161 | SlTimeval_t timeVal; |
dflet | 0:50cedd586816 | 162 | SlSockNonblocking_t enableOption; |
dflet | 0:50cedd586816 | 163 | |
dflet | 0:50cedd586816 | 164 | sock = _cc3100_Module._socket.accept(iSockDesc, &sClientAddr, &uiClientAddrLen); |
dflet | 0:50cedd586816 | 165 | if(sock >= 0) |
dflet | 0:50cedd586816 | 166 | { |
dflet | 0:50cedd586816 | 167 | enableOption.NonblockingEnabled = 0; |
dflet | 0:50cedd586816 | 168 | |
dflet | 0:50cedd586816 | 169 | //Blocking socket - Enable blocking mode |
dflet | 0:50cedd586816 | 170 | if(_cc3100_Module._socket.sl_SetSockOpt(sock,SOL_SOCKET,SL_SO_NONBLOCKING, &enableOption,sizeof(enableOption)) < 0) |
dflet | 0:50cedd586816 | 171 | { |
dflet | 0:50cedd586816 | 172 | CloseTCPClientSocket(sock); |
dflet | 0:50cedd586816 | 173 | return -1; |
dflet | 0:50cedd586816 | 174 | } |
dflet | 0:50cedd586816 | 175 | |
dflet | 0:50cedd586816 | 176 | timeVal.tv_sec = 1; // 1 Seconds |
dflet | 0:50cedd586816 | 177 | timeVal.tv_usec = 0; // Microseconds. 10000 microseconds resoultion |
dflet | 0:50cedd586816 | 178 | if((_cc3100_Module._socket.sl_SetSockOpt(sock,SOL_SOCKET,SL_SO_RCVTIMEO, &timeVal, sizeof(timeVal))) < 0) |
dflet | 0:50cedd586816 | 179 | { |
dflet | 0:50cedd586816 | 180 | CloseTCPClientSocket(sock); |
dflet | 0:50cedd586816 | 181 | return -1; |
dflet | 0:50cedd586816 | 182 | }// Enable receive timeout |
dflet | 0:50cedd586816 | 183 | } |
dflet | 0:50cedd586816 | 184 | return sock; |
dflet | 0:50cedd586816 | 185 | } |
dflet | 0:50cedd586816 | 186 | |
dflet | 0:50cedd586816 | 187 | int CloseTCPClientSocket(int iSockDesc) |
dflet | 0:50cedd586816 | 188 | { |
dflet | 0:50cedd586816 | 189 | int ittr = 0; |
dflet | 0:50cedd586816 | 190 | |
dflet | 0:50cedd586816 | 191 | if(iSockDesc < 0) |
dflet | 0:50cedd586816 | 192 | { |
dflet | 0:50cedd586816 | 193 | return 0; |
dflet | 0:50cedd586816 | 194 | } |
dflet | 0:50cedd586816 | 195 | |
dflet | 0:50cedd586816 | 196 | do |
dflet | 0:50cedd586816 | 197 | { |
dflet | 0:50cedd586816 | 198 | if(_cc3100_Module._socket.sl_Close(iSockDesc) >= 0) |
dflet | 0:50cedd586816 | 199 | { |
dflet | 0:50cedd586816 | 200 | iSockDesc = -1; |
dflet | 0:50cedd586816 | 201 | // HttpDebug("\n Http client socket closed\n\r"); |
dflet | 0:50cedd586816 | 202 | |
dflet | 0:50cedd586816 | 203 | return 0; |
dflet | 0:50cedd586816 | 204 | } |
dflet | 0:50cedd586816 | 205 | else |
dflet | 0:50cedd586816 | 206 | { |
dflet | 0:50cedd586816 | 207 | HttpDebug("\n client socket close error\n\r"); |
dflet | 0:50cedd586816 | 208 | OSI_DELAY(500);//wait 500ms |
dflet | 0:50cedd586816 | 209 | } |
dflet | 0:50cedd586816 | 210 | ittr++; |
dflet | 0:50cedd586816 | 211 | }while(ittr < 3); |
dflet | 0:50cedd586816 | 212 | |
dflet | 0:50cedd586816 | 213 | return -1; |
dflet | 0:50cedd586816 | 214 | } |
dflet | 0:50cedd586816 | 215 | |
dflet | 0:50cedd586816 | 216 | int ClientSocketSend(long socket, char * buffer, unsigned int len) |
dflet | 0:50cedd586816 | 217 | { |
dflet | 7:a069c1750fbc | 218 | // HttpDebug("\r\n ClientSocketSend\n\r"); |
dflet | 0:50cedd586816 | 219 | int send_len = 0, Ittr = 0; |
dflet | 0:50cedd586816 | 220 | |
dflet | 0:50cedd586816 | 221 | do |
dflet | 0:50cedd586816 | 222 | { |
dflet | 0:50cedd586816 | 223 | send_len = (int)_cc3100_Module._socket.send((int)socket, buffer, (int)len, 0); |
dflet | 0:50cedd586816 | 224 | |
dflet | 0:50cedd586816 | 225 | if(send_len > 0) |
dflet | 0:50cedd586816 | 226 | { |
dflet | 0:50cedd586816 | 227 | if(len != send_len) |
dflet | 0:50cedd586816 | 228 | { |
dflet | 0:50cedd586816 | 229 | HttpDebug("client Send length is not matching %d \n\r", send_len); |
dflet | 0:50cedd586816 | 230 | send_len = -1; |
dflet | 0:50cedd586816 | 231 | } |
dflet | 0:50cedd586816 | 232 | return send_len; |
dflet | 0:50cedd586816 | 233 | } |
dflet | 0:50cedd586816 | 234 | else if(send_len != SL_EAGAIN) |
dflet | 0:50cedd586816 | 235 | { |
dflet | 0:50cedd586816 | 236 | HttpDebug("\n client socket send error %d\n\r", send_len); |
dflet | 0:50cedd586816 | 237 | return -1; |
dflet | 0:50cedd586816 | 238 | } |
dflet | 0:50cedd586816 | 239 | |
dflet | 0:50cedd586816 | 240 | Ittr++; |
dflet | 0:50cedd586816 | 241 | |
dflet | 0:50cedd586816 | 242 | } while((SL_EAGAIN == send_len)); |
dflet | 0:50cedd586816 | 243 | |
dflet | 0:50cedd586816 | 244 | HttpDebug("\n client send time out %d\n\r", send_len); |
dflet | 0:50cedd586816 | 245 | |
dflet | 0:50cedd586816 | 246 | return -1; |
dflet | 0:50cedd586816 | 247 | } |
dflet | 0:50cedd586816 | 248 | |
dflet | 0:50cedd586816 | 249 | |
dflet | 0:50cedd586816 | 250 | /// @} |
dflet | 0:50cedd586816 | 251 |