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
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
11
dep/server.c
11
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,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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
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)
|
||||
* [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);
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue