Gestion du TIMEOUT lors du blocage (tout fonctionne bien)
This commit is contained in:
parent
eb3a4b7063
commit
0e4baf6a4e
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
11
dep/server.c
11
dep/server.c
|
@ -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,9 +358,15 @@ 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) */
|
||||||
|
setSocketTimeout(FTP_SOCKET, 1);
|
||||||
|
|
||||||
|
/* B. On attends une réponse */
|
||||||
tmp[2] = sread(FTP_SOCKET, BUFFER);
|
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) */
|
/* 6. On transmet le message de fin de la transaction (226) */
|
||||||
strcpy(response, STOP_DAT_MSG);
|
strcpy(response, STOP_DAT_MSG);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
12
proxy_ftp.c
12
proxy_ftp.c
|
@ -104,15 +104,20 @@ int main(int argc, char* argv[]){
|
||||||
* [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);
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue