diff --git a/dep/client.c b/dep/client.c index e736653..09ceb6b 100644 --- a/dep/client.c +++ b/dep/client.c @@ -47,6 +47,7 @@ int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ // si erreur if( *pSocket == -1 ) return -1; + /* [4] On établit la connection =======================================================*/ CONNECT = connect( @@ -63,6 +64,9 @@ int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ // on a plus besoin des infos de l'adresse freeaddrinfo(addrinfo); + + /* [5] On retourne la SOCKET + =======================================================*/ return *pSocket; } diff --git a/dep/client.h b/dep/client.h index 719c869..bac9c50 100644 --- a/dep/client.h +++ b/dep/client.h @@ -14,6 +14,7 @@ * [2] On récupère les infos * [3] Création de la socket * [4] On établit la connection +* [5] On retourne la SOCKET * */ int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket); diff --git a/dep/server.c b/dep/server.c index 4247e57..b1b8e63 100644 --- a/dep/server.c +++ b/dep/server.c @@ -63,6 +63,7 @@ void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket){ // si erreur if( SOCKET == -1 ) return; + /* [4] On publie la SOCKET =======================================================*/ BIND = bind( @@ -357,10 +358,16 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE // printf("") /* 5. On vide le BUS DE COMMANDE du serveur FTP */ - printf("XX: [%d]\n", tmp[2]); - tmp[2] = sread(FTP_SOCKET, BUFFER); - printf("YY: [%d]\n", tmp[2]); - + /* A. On définit un TIMEOUT (1 sec) */ + setSocketTimeout(FTP_SOCKET, 1); + + /* B. On attends une réponse */ + tmp[2] = sread(FTP_SOCKET, BUFFER); + + /* C. On enlève le TIMEOUT (default) */ + setSocketTimeout(FTP_SOCKET, SOCKET_TIMEOUT); + + /* 6. On transmet le message de fin de la transaction (226) */ strcpy(response, STOP_DAT_MSG); break; diff --git a/dep/server.h b/dep/server.h index aea8467..434d260 100644 --- a/dep/server.h +++ b/dep/server.h @@ -89,6 +89,9 @@ void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE * 3. On redirige sur la SOCKET utilisateur (BUS DE DONNEES) * 4. On ferme les SOCKETS du BUS DE DONNEES * 5. On vide le BUS DE COMMANDE du serveur FTP +* A. On définit un TIMEOUT (1 sec +* B. On attends une réponse +* C. On enlève le TIMEOUT (default) * 6. On transmet le message de fin de la transaction (226) * * (9) 226- Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES) diff --git a/dep/utility.c b/dep/utility.c index dbbea23..80c7c75 100644 --- a/dep/utility.c +++ b/dep/utility.c @@ -65,47 +65,18 @@ int indexOf(char* haystack, char needle){ } -void formatBuffer(char* pBuffer){ - if( DEBUGMOD&BUF ) printf( "BUFLEN (bef): %lu\n", strlen(pBuffer) ); - if( DEBUGMOD&BUF ) printf( "BUFFER: (%s)\n", pBuffer ); - - /* [1] On retire les "\n" et "\r" de la fin de la chaine - ============================================================*/ - unsigned long i = strlen(pBuffer) - 1; - - revealString(pBuffer); - while( pBuffer[i] == '\r' || pBuffer[i] == '\n' ){ - printf("(%lu)\n", i); - if( pBuffer[i] != '\r' && pBuffer[i] != '\n' ) - break; - - pBuffer[i] = '\0'; - i = strlen(pBuffer) - 1; - } - - revealString(pBuffer); - /* [2] On ajoute "\r\n" à la fin - ============================================================*/ - strcat(pBuffer, "\r\n\0"); - - if( DEBUGMOD&BUF ) printf( "BUFLEN (aft): %lu\n", strlen(pBuffer) ); -} - int swrite(int* pSocket, char* pBuffer){ if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p - /* 1. On formatte le Buffer */ - // formatBuffer(pBuffer); - - /* 2. On écrit sur la SOCKET */ + /* 1. On écrit sur la SOCKET */ if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer)); int nbSent = write(*pSocket, pBuffer, strlen(pBuffer)); if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent); - /* 3. Si on est déconnecté, on retourne une erreur */ + /* 2. Si on est déconnecté, on retourne une erreur */ if( nbSent <= 0 ){ if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n"); return -1; // on retourne une erreur @@ -116,7 +87,7 @@ int swrite(int* pSocket, char* pBuffer){ if( DEBUGMOD&RVL ) printf("SEND_2\n"); - /* 4. On retourne le nombre de envoyés */ + /* 3. On retourne le nombre de envoyés */ return nbSent; } @@ -149,6 +120,17 @@ int sread(int* pSocket, char* pBuffer){ } +void setSocketTimeout(int* pSocket, const int pTimeout){ + /* 1. On créé la structure contenant le timeout */ + struct timeval timeout; + timeout.tv_sec = pTimeout; + timeout.tv_usec = 0; + + setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)); + + if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec ); +} + void xPrint(char* pPattern, char* pBuffer){ char tmpBuffer[maxBuffLen]; diff --git a/dep/utility.h b/dep/utility.h index bae3723..d27ba60 100644 --- a/dep/utility.h +++ b/dep/utility.h @@ -33,15 +33,6 @@ int indexOf(char* haystack, char needle); -/* Formatte un buffer pour être envoyé -* -* @pBuffer Buffer en question -* -*/ -void formatBuffer(char *pBuffer); - - - /* read/write socket */ int swrite(int* pSocket, char* pBuffer); int sread(int* pSocket, char* pBuffer); diff --git a/proxy_ftp.c b/proxy_ftp.c index 8b0008c..bee0801 100644 --- a/proxy_ftp.c +++ b/proxy_ftp.c @@ -97,22 +97,27 @@ int main(int argc, char* argv[]){ * @THREADABLE_SOCKET SOCKET de la connexion client * * @history -* [1] Initialisation des variables -* [2] Envoi de la séquence de bienvenue -* [3] Attente des données reçues et reception (CLIENT_FTP->PROXY) -* [4] Traitement de la requête client -* [5] Redirection de la requête vers le serveur FTP (PROXY->SERVER_FTP) -* [6] Traitement de la reponse du serveur FTP -* [7] Redirection de la réponse vers le client (PROXY->CLIENT_FTP) -* +* [1] Initialisation des variables +* [2] Envoi de la séquence de bienvenue +* [3] Attente des données reçues et reception (CLIENT_FTP->PROXY) +* [4] Traitement de la requête client +* [5] Redirection de la requête vers le serveur FTP (PROXY->SERVER_FTP) +* [6] Traitement de la reponse du serveur FTP +* [7] Redirection de la réponse vers le client (PROXY->CLIENT_FTP) +* [8] On vide les buffers +* [9] Fermeture des connections (SOCKETS) +* [10] Arrêt du THREAD +* 1. On récupère le rang dans les "managers" +* 2. On met à jour "activeManagers" +* 3. On arrête le THREAD * */ void* manageConnection(void* THREADABLE_SOCKET){ - int USER_SOCKET = (intptr_t) THREADABLE_SOCKET; + int USER_SOCKET = (intptr_t) THREADABLE_SOCKET; // BUS DE COMMANDE utilisateur /* [1] Variables ============================================================================*/ - // int USER_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur + // int USER_SOCKET = -1; int FTP_SOCKET = -1; // contiendra le BUS DE COMMANDE FTP int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP @@ -183,6 +188,7 @@ void* manageConnection(void* THREADABLE_SOCKET){ if( index != -1 ) activeManagers[index] = 0; + /* 3. On arrête le THREAD */ if( DEBUGMOD&THR ) printf("THREAD[%d] libéré\n", index); pthread_exit(NULL); } \ No newline at end of file diff --git a/proxy_ftp.h b/proxy_ftp.h index 57e5dc6..9d5ab2e 100644 --- a/proxy_ftp.h +++ b/proxy_ftp.h @@ -33,7 +33,7 @@ #define THR 0x40 // FILTRE pour THREADS // possibilité de cumuler les DEBUGMODES -#define DEBUGMOD 0 // REVEALS + HEADER + THREADS +#define DEBUGMOD SCK // REVEALS + HEADER + THREADS /* vars */ @@ -44,12 +44,10 @@ #define maxHostLen 64 #define maxPortLen 6 -// #define FTP_HOST "31.170.164.47" +// #define FTP_HOST "31.170.164.47" // u712664263 #define FTP_HOST "localhost" #define FTP_PORT "21" -// u712664263 - - +#define SOCKET_TIMEOUT 10, 0 // 10 secondes & 0 micro /* MESSAGES */ // 220-\n // 220- +----------------------------+\n diff --git a/test b/test index 020360e..5d01d9c 100755 Binary files a/test and b/test differ