diff --git a/src/software_test/tcpServer_test/FTPClient.cpp b/src/software_test/tcpServer_test/FTPClient.cpp index 8cd4175..8fe365f 100644 --- a/src/software_test/tcpServer_test/FTPClient.cpp +++ b/src/software_test/tcpServer_test/FTPClient.cpp @@ -5,6 +5,7 @@ _ftpCommand({'\0'}), _cmdParameters(NULL), _loggedIn(false), _username(NULL), +_dataSocketOpen(false), _ftpClientState(FTPServer::FTPClientState::WAITING_FOR_COMMANDS), _binaryFlag(FTPServer::BinaryFlag::OFF) { diff --git a/src/software_test/tcpServer_test/FTPClient.h b/src/software_test/tcpServer_test/FTPClient.h index 8be23e7..8774915 100644 --- a/src/software_test/tcpServer_test/FTPClient.h +++ b/src/software_test/tcpServer_test/FTPClient.h @@ -23,6 +23,7 @@ class FTPClient : public TCPClient Dictionary *_cmdParameters; boolean _loggedIn; char *_username; + boolean _dataSocketOpen; FTPServer::FTPClientState _ftpClientState; FTPServer::BinaryFlag _binaryFlag; diff --git a/src/software_test/tcpServer_test/FTPServer.h b/src/software_test/tcpServer_test/FTPServer.h index ff9c8ae..340324b 100644 --- a/src/software_test/tcpServer_test/FTPServer.h +++ b/src/software_test/tcpServer_test/FTPServer.h @@ -14,7 +14,8 @@ class FTPServer : public TCPServer FTPServer(unsigned int port = 21, const char *login = NULL, const char *password = NULL, uint8_t maxClient = MAX_CLIENT, uint16_t clientCommandDataBufferSize = 255) : TCPServer(port, maxClient, clientCommandDataBufferSize), _login(NULL), _password(NULL), - _dataServer(1024) + _dataPort(1024), + _dataServer(_dataPort) { if(login != NULL) { @@ -49,6 +50,27 @@ class FTPServer : public TCPServer virtual void processClientData(T *client) { + if(client->_dataSocketOpen) + { + #ifdef DEBUG_FTPS + Serial.println("Listening for new data client"); + #endif + WiFiClient dataClient = _dataServer.available(); + + if(dataClient) + { + if(dataClient.connected()) + { + client->_dataSocketOpen = false; + client->setDataClient(dataClient); + #ifdef DEBUG_FTPS + Serial.println("Data client accepted successfully"); + #endif + } + else + dataClient.stop(); + } + } #ifdef DEBUG_FTPS if(client->_newDataAvailable) @@ -56,12 +78,15 @@ class FTPServer : public TCPServer Serial.print("Client --> ");Serial.print(client->_id);Serial.print(" : ");Serial.print((char *)client->_data);Serial.println("#"); } #endif - - switch(client->_ftpClientState) + + if(client->_dataSize > 0) { - case WAITING_FOR_COMMANDS: - processCommands(client); - break; + switch(client->_ftpClientState) + { + case WAITING_FOR_COMMANDS: + processCommands(client); + break; + } } } @@ -154,15 +179,18 @@ class FTPServer : public TCPServer } else if(strcmp(client->_ftpCommand,"PASV") == 0) { - _dataServer.begin(); - client->_client.printf("227 Entering Passive Mode (%d,%d,%d,%d,%d,%d).\r\n", 192,168,0,29,1024/256, 1024%256); + _dataServer.begin(_dataPort); + client->_client.printf("227 Entering Passive Mode (%u,%u,%u,%u,%d,%d).\r\n", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3], _dataPort/256, _dataPort%256); + client->_dataSocketOpen = true; } + ese if() else client->_client.println("502 Command not implemented."); } char *_login; char *_password; + unsigned int _dataPort; WiFiServer _dataServer; //In passive mode, the FTP server opens two different ports (one for the commands and the other for the data stream) }; diff --git a/src/software_test/tcpServer_test/TCPServer.h b/src/software_test/tcpServer_test/TCPServer.h index 2249c88..f65b5ce 100644 --- a/src/software_test/tcpServer_test/TCPServer.h +++ b/src/software_test/tcpServer_test/TCPServer.h @@ -6,7 +6,7 @@ #include "TCPClient.h" #define MAX_CLIENT -1 -#define DEBUG +#define DEBUG_TCPS template @@ -78,14 +78,19 @@ class TCPServer wc = _wifiServer.available(); } - if(wc && wc.connected()) + if(wc) { - T *clientPointer = createNewClient(wc); - _clientList.addFirst(clientPointer); - #ifdef DEBUG - Serial.print("TCPServer : New client accepted : ");Serial.println(clientPointer->_id); - #endif - greetClient(clientPointer); + if(wc.connected()) + { + T *clientPointer = createNewClient(wc); + _clientList.addFirst(clientPointer); + #ifdef DEBUG_TCPS + Serial.print("TCPServer : New client accepted : ");Serial.println(clientPointer->_id); + #endif + greetClient(clientPointer); + } + else + wc.stop(); } _currentClient = _clientList.removeLastRef();//We pick a client in the list to process it's request @@ -132,7 +137,7 @@ class TCPServer } else if(!(_currentClient->_client).connected()) { - #ifdef DEBUG + #ifdef DEBUG_TCPS Serial.print("TCPServer : Client disconnected and can be discarded : ");Serial.println(_currentClient->_id); #endif _currentClient->_clientState = TCPClient::DISCARDED; @@ -140,14 +145,14 @@ class TCPServer if(_currentClient->_dataSize > 0) { - processClientData(_currentClient);//We process the actual data _currentClient->_newDataAvailable = false; } + processClientData(_currentClient);//We process the actual data if(_currentClient->_clientState == TCPClient::ClientState::DISCARDED) { _currentClient->closeConnection(); - #ifdef DEBUG + #ifdef DEBUG_TCPS Serial.print("TCPServer : Client was discarded : ");Serial.println(_currentClient->_id); #endif delete _currentClient; diff --git a/src/software_test/tcpServer_test/WEBServer.h b/src/software_test/tcpServer_test/WEBServer.h index 9e01b3e..c4184fb 100644 --- a/src/software_test/tcpServer_test/WEBServer.h +++ b/src/software_test/tcpServer_test/WEBServer.h @@ -63,19 +63,22 @@ class WEBServer : public TCPServer virtual void processClientData(T *client) { - switch(client->_WEBClientState) + if(client->_dataSize > 0) { - case ACCEPTED: - queryParser(client); - break; - case QUERY_PARSED: - sendDataToClient(client); - break; - case RESPONSE_SENT: - break; - case DONE: - break; - } + switch(client->_WEBClientState) + { + case ACCEPTED: + queryParser(client); + break; + case QUERY_PARSED: + sendDataToClient(client); + break; + case RESPONSE_SENT: + break; + case DONE: + break; + } + } } void queryParser(T *client)