Gestion du TIMEOUT lors du blocage (tout fonctionne bien)

This commit is contained in:
xdrm-brackets 2015-12-17 18:25:39 +01:00
parent eb3a4b7063
commit 0e4baf6a4e
9 changed files with 52 additions and 60 deletions

View File

@ -47,6 +47,7 @@ int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
// si erreur // si erreur
if( *pSocket == -1 ) return -1; if( *pSocket == -1 ) return -1;
/* [4] On établit la connection /* [4] On établit la connection
=======================================================*/ =======================================================*/
CONNECT = connect( CONNECT = connect(
@ -63,6 +64,9 @@ int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
// on a plus besoin des infos de l'adresse // on a plus besoin des infos de l'adresse
freeaddrinfo(addrinfo); freeaddrinfo(addrinfo);
/* [5] On retourne la SOCKET
=======================================================*/
return *pSocket; return *pSocket;
} }

View File

@ -14,6 +14,7 @@
* [2] On récupère les infos * [2] On récupère les infos
* [3] Création de la socket * [3] Création de la socket
* [4] On établit la connection * [4] On établit la connection
* [5] On retourne la SOCKET
* *
*/ */
int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket); int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket);

View File

@ -63,6 +63,7 @@ void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket){
// si erreur // si erreur
if( SOCKET == -1 ) return; if( SOCKET == -1 ) return;
/* [4] On publie la SOCKET /* [4] On publie la SOCKET
=======================================================*/ =======================================================*/
BIND = bind( BIND = bind(
@ -357,10 +358,16 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
// printf("") // printf("")
/* 5. On vide le BUS DE COMMANDE du serveur FTP */ /* 5. On vide le BUS DE COMMANDE du serveur FTP */
printf("XX: [%d]\n", tmp[2]); /* A. On définit un TIMEOUT (1 sec) */
tmp[2] = sread(FTP_SOCKET, BUFFER); setSocketTimeout(FTP_SOCKET, 1);
printf("YY: [%d]\n", tmp[2]);
/* 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) */ /* 6. On transmet le message de fin de la transaction (226) */
strcpy(response, STOP_DAT_MSG); strcpy(response, STOP_DAT_MSG);
break; break;

View File

@ -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) * 3. On redirige sur la SOCKET utilisateur (BUS DE DONNEES)
* 4. On ferme les SOCKETS du BUS DE DONNEES * 4. On ferme les SOCKETS du BUS DE DONNEES
* 5. On vide le BUS DE COMMANDE du serveur FTP * 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) * 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) * (9) 226- Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES)

View File

@ -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){ int swrite(int* pSocket, char* pBuffer){
if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur 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 if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p
/* 1. On formatte le Buffer */
// formatBuffer(pBuffer);
/* 1. On écrit sur la SOCKET */
/* 2. On écrit sur la SOCKET */
if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer)); if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer));
int nbSent = write(*pSocket, pBuffer, strlen(pBuffer)); int nbSent = write(*pSocket, pBuffer, strlen(pBuffer));
if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent); 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( nbSent <= 0 ){
if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n"); if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n");
return -1; // on retourne une erreur return -1; // on retourne une erreur
@ -116,7 +87,7 @@ int swrite(int* pSocket, char* pBuffer){
if( DEBUGMOD&RVL ) printf("SEND_2\n"); if( DEBUGMOD&RVL ) printf("SEND_2\n");
/* 4. On retourne le nombre de <char> envoyés */ /* 3. On retourne le nombre de <char> envoyés */
return nbSent; 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){ void xPrint(char* pPattern, char* pBuffer){
char tmpBuffer[maxBuffLen]; char tmpBuffer[maxBuffLen];

View File

@ -33,15 +33,6 @@ int indexOf(char* haystack, char needle);
/* Formatte un buffer pour être envoyé
*
* @pBuffer<char*> Buffer en question
*
*/
void formatBuffer(char *pBuffer);
/* read/write socket */ /* read/write socket */
int swrite(int* pSocket, char* pBuffer); int swrite(int* pSocket, char* pBuffer);
int sread(int* pSocket, char* pBuffer); int sread(int* pSocket, char* pBuffer);

View File

@ -97,22 +97,27 @@ int main(int argc, char* argv[]){
* @THREADABLE_SOCKET<void*> SOCKET de la connexion client * @THREADABLE_SOCKET<void*> SOCKET de la connexion client
* *
* @history * @history
* [1] Initialisation des variables * [1] Initialisation des variables
* [2] Envoi de la séquence de bienvenue * [2] Envoi de la séquence de bienvenue
* [3] Attente des données reçues et reception (CLIENT_FTP->PROXY) * [3] Attente des données reçues et reception (CLIENT_FTP->PROXY)
* [4] Traitement de la requête client * [4] Traitement de la requête client
* [5] Redirection de la requête vers le serveur FTP (PROXY->SERVER_FTP) * [5] Redirection de la requête vers le serveur FTP (PROXY->SERVER_FTP)
* [6] Traitement de la reponse du serveur FTP * [6] Traitement de la reponse du serveur FTP
* [7] Redirection de la réponse vers le client (PROXY->CLIENT_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){ 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 /* [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 FTP_SOCKET = -1; // contiendra le BUS DE COMMANDE FTP
int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur
int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP
@ -183,6 +188,7 @@ void* manageConnection(void* THREADABLE_SOCKET){
if( index != -1 ) if( index != -1 )
activeManagers[index] = 0; activeManagers[index] = 0;
/* 3. On arrête le THREAD */
if( DEBUGMOD&THR ) printf("THREAD[%d] libéré\n", index); if( DEBUGMOD&THR ) printf("THREAD[%d] libéré\n", index);
pthread_exit(NULL); pthread_exit(NULL);
} }

View File

@ -33,7 +33,7 @@
#define THR 0x40 // FILTRE pour THREADS #define THR 0x40 // FILTRE pour THREADS
// possibilité de cumuler les DEBUGMODES // possibilité de cumuler les DEBUGMODES
#define DEBUGMOD 0 // REVEALS + HEADER + THREADS #define DEBUGMOD SCK // REVEALS + HEADER + THREADS
/* vars */ /* vars */
@ -44,12 +44,10 @@
#define maxHostLen 64 #define maxHostLen 64
#define maxPortLen 6 #define maxPortLen 6
// #define FTP_HOST "31.170.164.47" // #define FTP_HOST "31.170.164.47" // u712664263
#define FTP_HOST "localhost" #define FTP_HOST "localhost"
#define FTP_PORT "21" #define FTP_PORT "21"
// u712664263 #define SOCKET_TIMEOUT 10, 0 // 10 secondes & 0 micro
/* MESSAGES */ /* MESSAGES */
// 220-\n // 220-\n
// 220- +----------------------------+\n // 220- +----------------------------+\n

BIN
test

Binary file not shown.