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
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;
}

View File

@ -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);

View File

@ -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,9 +358,15 @@ 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]);
/* A. On définit un TIMEOUT (1 sec) */
setSocketTimeout(FTP_SOCKET, 1);
/* B. On attends une réponse */
tmp[2] = sread(FTP_SOCKET, BUFFER);
printf("YY: [%d]\n", tmp[2]);
/* 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);

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)
* 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)

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){
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 <char> envoyés */
/* 3. On retourne le nombre de <char> 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];

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 */
int swrite(int* pSocket, char* pBuffer);
int sread(int* pSocket, char* pBuffer);

View File

@ -104,15 +104,20 @@ int main(int argc, char* argv[]){
* [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);
}

View File

@ -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

BIN
test

Binary file not shown.