MULTITHREAD OK
This commit is contained in:
parent
5cb2b373b4
commit
9e9f09d796
102
dep/server.c
102
dep/server.c
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket){
|
void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket){
|
||||||
if( DEBUGMOD&HDR ) printf("====== DROP_SERVER(%s, %s, %d) ======\n\n", serverHost, *givenPort, *listenSocket);
|
if( DEBUGMOD&HDR ) printf("====== DROP_SERVER(%s, %s, %d) ======\n\n", serverHost, *givenPort, *listenSocket);
|
||||||
|
|
||||||
// FONCTIONNEMENT
|
// FONCTIONNEMENT
|
||||||
|
@ -124,14 +124,14 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// CMD: CLIENT (SRV) PROXY (CLT) FTP
|
|
||||||
// DTA: CLIENT (CLT) PROXY (CLT) FTP
|
|
||||||
//
|
|
||||||
void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){
|
void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){
|
||||||
if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d, %d, %d) ======\n\n", pRequest, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET);
|
if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d, %d, %d) ======\n\n", pRequest, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET);
|
||||||
|
|
||||||
|
|
||||||
char response[maxBuffLen]; // contiendra la réponse
|
char response[maxBuffLen]; // contiendra la réponse (2*taille buffer pour strcat(BUFLEN, BUFLEN))
|
||||||
int nbSend; // contiendra le nombre de données envoyées
|
int nbSend; // contiendra le nombre de données envoyées
|
||||||
char rCommand[5]; // contiendra les commandes (1ère partie)
|
char rCommand[5]; // contiendra les commandes (1ère partie)
|
||||||
char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie)
|
char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie)
|
||||||
|
@ -153,40 +153,40 @@ void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
/* (1) USER username@serveur => connection FTP (commande)
|
/* (1) USER username@serveur => connection FTP (commande)
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
if( strcmp(rCommand, "USER") == 0 && indexOf(rContent, '@') >= 0 ){
|
if( strcmp(rCommand, "USER") == 0 && indexOf(rContent, '@') >= 0 ){
|
||||||
char userName[maxBuffLen] = {0};
|
char userName[100] = {0};
|
||||||
char hostName[maxHostLen] = {0};
|
char hostName[maxHostLen] = {0};
|
||||||
|
// pour l'envoi de la séquence d'initialisation
|
||||||
|
char* ftp_response; ftp_response = malloc(maxBuffLen);
|
||||||
|
memset(ftp_response, 0, maxBuffLen);
|
||||||
|
|
||||||
|
/* 1. On extrait @username et @hostname */
|
||||||
sscanf(rContent, "%[^@]@%s\r\n", userName, hostName);
|
sscanf(rContent, "%[^@]@%s\r\n", userName, hostName);
|
||||||
|
|
||||||
|
|
||||||
if( DEBUGMOD&BUF ) printf("USERNAME [[%s]]\n", userName);
|
if( DEBUGMOD&BUF ) printf("USERNAME [[%s]]\n", userName);
|
||||||
if( DEBUGMOD&BUF ) printf("HOSTNAME [[%s]]\n", hostName);
|
if( DEBUGMOD&BUF ) printf("HOSTNAME [[%s]]\n", hostName);
|
||||||
|
|
||||||
/* On se connecte au serveur FTP (commandes) */
|
|
||||||
|
/* 2. On se connecte au serveur FTP (commandes) */
|
||||||
CONNECT_CLIENT(hostName, FTP_PORT, FTP_SOCKET);
|
CONNECT_CLIENT(hostName, FTP_PORT, FTP_SOCKET);
|
||||||
if( *FTP_SOCKET == -1 ) printf("CAN'T CONNECT TO GIVEN SERVER!!\n");
|
if( *FTP_SOCKET == -1 ) printf("CAN'T CONNECT TO GIVEN SERVER!!\n");
|
||||||
|
|
||||||
if( DEBUGMOD&SCK ) printf("FTP SOCKET CONNECTED AT %s:%s\n", hostName, FTP_PORT);
|
if( DEBUGMOD&SCK ) printf("FTP SOCKET CONNECTED AT %s:%s\n", hostName, FTP_PORT);
|
||||||
|
|
||||||
/* On envoie la séquence d'initialisation */
|
|
||||||
char BUFFER[maxBuffLen] = {0};
|
|
||||||
char* ftp_response; ftp_response = malloc(maxBuffLen);
|
|
||||||
memset(ftp_response, 0, maxBuffLen);
|
|
||||||
|
|
||||||
strcpy(BUFFER, "\r\n");
|
/* 3. On envoie la séquence d'initialisation */
|
||||||
CLIENT_SEND(FTP_SOCKET, BUFFER, &ftp_response);
|
CLIENT_SEND(FTP_SOCKET, "\r\n", &ftp_response);
|
||||||
|
|
||||||
if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER);
|
if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", "\r\n");
|
||||||
if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response);
|
if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response);
|
||||||
|
|
||||||
// char BUFF[maxBuffLen] = {0};
|
|
||||||
// strcpy(BUFF, "");
|
|
||||||
// swrite(FTP_SOCKET, BUFF);
|
|
||||||
// sread(FTP_SOCKET, BUFF);
|
|
||||||
// swrite(USER_SOCKET, strcat(BUFF, "\r\n"));
|
|
||||||
|
|
||||||
|
/* 4. On envoie la requête USER au serveur FTP auquel on vient de se connecter */
|
||||||
|
char newRequest[maxBuffLen];
|
||||||
|
strcat(newRequest, "USER ");
|
||||||
|
strcat(newRequest, userName);
|
||||||
|
strcat(newRequest, "\r\n");
|
||||||
|
printf("NEW REQ: [[%s]]\n", newRequest);
|
||||||
strcpy(response, "USER xdrm\r\n");
|
strcpy(response, "USER xdrm\r\n");
|
||||||
printf("RESP: [[%s]]\n", response);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif)
|
/* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif)
|
||||||
|
@ -199,6 +199,7 @@ void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
char serverPort[maxPortLen] = {0};
|
char serverPort[maxPortLen] = {0};
|
||||||
char BUFFER[maxBuffLen] = {0};
|
char BUFFER[maxBuffLen] = {0};
|
||||||
|
|
||||||
|
/* 1. On récupère l'ip et le port de la réponse */
|
||||||
sscanf(pRequest, "PORT %d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2);
|
sscanf(pRequest, "PORT %d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2);
|
||||||
// on récupère l'adresse en <char*>
|
// on récupère l'adresse en <char*>
|
||||||
sprintf(serverHost, "%d.%d.%d.%d", a1, a2, a3, a4);
|
sprintf(serverHost, "%d.%d.%d.%d", a1, a2, a3, a4);
|
||||||
|
@ -206,12 +207,12 @@ void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
sprintf(serverPort, "%d", p1*256+p2);
|
sprintf(serverPort, "%d", p1*256+p2);
|
||||||
|
|
||||||
|
|
||||||
// on se connecte au client
|
/* 2. On se connecte au client */
|
||||||
if( DEBUGMOD&SCK ) printf("CONNECTING TO CLIENT %s:%s\n", serverHost, serverPort);
|
if( DEBUGMOD&SCK ) printf("CONNECTING TO CLIENT %s:%s\n", serverHost, serverPort);
|
||||||
CONNECT_CLIENT(serverHost, serverPort, DUSER_SOCKET);
|
CONNECT_CLIENT(serverHost, serverPort, DUSER_SOCKET);
|
||||||
if( DEBUGMOD&SCK ) printf("CONNECTED TO CLIENT %s:%s\n", serverHost, serverPort);
|
if( DEBUGMOD&SCK ) printf("CONNECTED TO CLIENT %s:%s\n", serverHost, serverPort);
|
||||||
|
|
||||||
// on envoie PASV car on veut être en mode passif entre le proxy et le serveur FTP
|
/* 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP */
|
||||||
strcpy(response, "PASV\r\n");
|
strcpy(response, "PASV\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,44 +252,48 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
|
|
||||||
/* [2] Selection en fonction de @ftpCode
|
/* [2] Selection en fonction de @ftpCode
|
||||||
================================================*/
|
================================================*/
|
||||||
|
switch(ftpCode){
|
||||||
/* (2) Demande d'username
|
/* (1) Demande d'username
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
if( ftpCode == 220 )
|
if( ftpCode == 220 )
|
||||||
strcpy(response, WLCM_MSG);
|
strcpy(response, WLCM_MSG);
|
||||||
|
|
||||||
|
|
||||||
/* (3) username OK -> demande MDP
|
/* (2) username OK -> demande MDP
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 331 )
|
case 331:
|
||||||
strcpy(response, USER_MSG);
|
strcpy(response, USER_MSG);
|
||||||
|
break;
|
||||||
|
|
||||||
/* (4) Bon mdp -> connection
|
/* (3) Bon mdp -> connection
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 230 )
|
case 230:
|
||||||
strcpy(response, PASS_BON_MSG);
|
strcpy(response, PASS_BON_MSG);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* (4) Mauvais mdp -> message erreur
|
||||||
|
|
||||||
/* (5) Mauvais mdp -> connection
|
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 530 )
|
case 530:
|
||||||
strcpy(response, PASS_BAD_MSG);
|
strcpy(response, PASS_BAD_MSG);
|
||||||
|
break;
|
||||||
|
|
||||||
/* (6) Info SYST
|
/* (5) Info SYST
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
// else if( ftpCode == 215 )
|
// case 215:
|
||||||
// strcpy(response, "bla\n");
|
// strcpy(response, "bla\n");
|
||||||
|
// break;
|
||||||
|
|
||||||
/* (7) LOGOUT => EXIT
|
|
||||||
|
/* (6) LOGOUT => EXIT
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 221 )
|
case 221:
|
||||||
strcpy(response, EXIT_MSG);
|
strcpy(response, EXIT_MSG);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
/* (8) Mode passif => On lance les SOCKETS du BUS DE DONNEES
|
/* (7) Mode passif => On lance les SOCKETS du BUS DE DONNEES
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 227 ){ // on lance la SOCKET FTP du BUS DE DONNEES
|
case 227: // on lance la SOCKET FTP du BUS DE DONNEES
|
||||||
int a1, a2, a3, a4 = 0;
|
int a1, a2, a3, a4 = 0;
|
||||||
int p1, p2 = 0;
|
int p1, p2 = 0;
|
||||||
|
|
||||||
|
@ -306,12 +311,12 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
if( DEBUGMOD&SCK ) printf("CONNECTED TO FTP %s:%s\n", serverHost, serverPort);
|
if( DEBUGMOD&SCK ) printf("CONNECTED TO FTP %s:%s\n", serverHost, serverPort);
|
||||||
|
|
||||||
strcpy(response, LIST_DAT_MSG);
|
strcpy(response, LIST_DAT_MSG);
|
||||||
}
|
break;
|
||||||
|
|
||||||
|
|
||||||
/* (9) On lit la SOCKET FTP du BUS DE DONNEES
|
/* (8) On lit la SOCKET FTP du BUS DE DONNEES
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 150 ){ // on lit la SOCKET FTP du BUS DE DONNEES
|
case 150:
|
||||||
|
|
||||||
char BUFFER[maxBuffLen] = {0};
|
char BUFFER[maxBuffLen] = {0};
|
||||||
|
|
||||||
|
@ -355,23 +360,24 @@ void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
|
|
||||||
// fin de la transaction
|
// fin de la transaction
|
||||||
strcpy(response, STOP_DAT_MSG);
|
strcpy(response, STOP_DAT_MSG);
|
||||||
}
|
break;
|
||||||
|
|
||||||
|
|
||||||
/* (10) Fin de transfert de données
|
/* (9) Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES)
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else if( ftpCode == 226 ){ // on ferme les SOCKETS du BUS DE DONNEES
|
case 226:
|
||||||
// strcpy(response, "226 Fin de la transaction!\r\n");
|
// strcpy(response, "226 Fin de la transaction!\r\n");
|
||||||
strcpy(response, "\r\n");
|
strcpy(response, "\r\n");
|
||||||
close(*DUSER_SOCKET);
|
close(*DUSER_SOCKET);
|
||||||
close(*DFTP_SOCKET);
|
close(*DFTP_SOCKET);
|
||||||
}
|
break;
|
||||||
|
|
||||||
/* (n) Commande inconnue
|
/* (n) Commande inconnue
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
else
|
default:
|
||||||
strcpy(response, pAnswer);
|
strcpy(response, pAnswer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* [3] Retour de la réponse
|
/* [3] Retour de la réponse
|
||||||
================================================*/
|
================================================*/
|
||||||
|
|
66
dep/server.h
66
dep/server.h
|
@ -1,27 +1,58 @@
|
||||||
/* Créé et met un serveur sur écoute
|
/* Créé et met un serveur sur écoute
|
||||||
*
|
*
|
||||||
|
* ==IN==
|
||||||
* @serverHost<char*> Nom de l'hôte local (localhost)
|
* @serverHost<char*> Nom de l'hôte local (localhost)
|
||||||
|
* @givenPort<char**> Si renseigné, définit le port à utiliser
|
||||||
*
|
*
|
||||||
* @givenPort<char**> Pointeur sur le <char*> à remplir => contiendra le port donné par le système
|
* ==OUT==
|
||||||
|
* @givenPort<char**> Pointeur sur le <char*> à remplir => contiendra le port donné par le système (si pas renseigné en entrée)
|
||||||
* @listenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
|
* @listenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
|
||||||
*
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @history
|
||||||
|
* [1] On définit le filtre/format
|
||||||
|
* [2] On récupère les infos (adresse, port)
|
||||||
|
* Note: Gestion IPv4/IPv6
|
||||||
|
* [3] Création de la socket
|
||||||
|
* [4] On publie la SOCKET (bind)
|
||||||
|
* [5] On récupère les informations du serveur (host/port)
|
||||||
|
* [6] On met la socket sur écoute (listen)
|
||||||
|
* [7] On envoie les données par référence
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket);
|
void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Gestion de la requête du client
|
/* Gestion de la requête du client
|
||||||
*
|
* ==IN/OUT==
|
||||||
* @pBuffer<char*> Requête en question
|
* @pBuffer<char*> Requête en question
|
||||||
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
|
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
|
||||||
* @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP
|
* @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP
|
||||||
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
|
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
|
||||||
* @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP
|
* @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP
|
||||||
*
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
* @history
|
* @history
|
||||||
* [1] si "PORT a1,a2,a3,a4,p1,p2" on démarre la SOCKET CLIENT du BUS DE DONNEES
|
* [1] On découpe la requête en 2 parties (rCommand, rContent)
|
||||||
* [2]
|
* [2] Selection en fonction de @rCommand
|
||||||
* [3]
|
*
|
||||||
|
* (1) USER username@serveur => connection FTP (commande)
|
||||||
|
* 1. On extrait @username et @hostname
|
||||||
|
* 2. On se connecte au serveur FTP (commandes)
|
||||||
|
* 3. On envoie la séquence d'initialisation
|
||||||
|
* 4. On envoie la requête USER au serveur FTP auquel on vient de se connecter
|
||||||
|
*
|
||||||
|
* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif)
|
||||||
|
* 1. On récupère l'ip et le port de la réponse
|
||||||
|
* 2. On se connecte au client
|
||||||
|
* 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP
|
||||||
|
* (n) Si aucun traitement on recopie la requête telquel
|
||||||
|
*
|
||||||
|
* [3] Retour de la réponse
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
||||||
|
|
||||||
|
@ -35,17 +66,24 @@ void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
|
||||||
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
|
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
|
||||||
* @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP
|
* @DFTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES FTP
|
||||||
*
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
* @history
|
* @history
|
||||||
* [1] SI commande sans transfert nécessaire, on modifie la réponse
|
* [1] On découpe la requête en 2 parties (ftpCode, ftpText)
|
||||||
|
* [2] Selection en fonction de @ftpCode
|
||||||
* [2] SI on a besoin d'un transfert de données
|
|
||||||
* (1) On initialise les SOCKETS avec la valeur de PORT a,b,c,d,p1,p2
|
|
||||||
* (2) a.b.c.d (adresse ip) + p1*256+p2 (port)
|
|
||||||
* (3) UTILISATEUR (ACIF) PROXY (PASSIF) SRV_FTP
|
|
||||||
*
|
*
|
||||||
* [3] SI 227, on lance la SOCKET FTP du BUS DE DONNEES (mode passif)
|
* (1) 220- Demande d'username
|
||||||
* [4] SI 226, on ferme les SOCKETS du BUS DE DONNEES
|
* (2) 331- username OK -> demande MDP
|
||||||
|
* (3) 230- Bon mdp -> connection
|
||||||
|
* (4) 530- Mauvais mdp -> message erreur
|
||||||
|
* (5) 215- Info SYST [COMMENTÉ]
|
||||||
|
* (6) 221- LOGOUT => EXIT (commande QUIT)
|
||||||
|
* (7) 227- Mode passif => On lance les SOCKETS du BUS DE DONNEES
|
||||||
|
* (8) 150- On lit la SOCKET FTP du BUS DE DONNEES
|
||||||
|
* (9) 226- Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES)
|
||||||
|
* (n) xxx- Commande inconnue
|
||||||
*
|
*
|
||||||
|
* [3] Retour de la réponse
|
||||||
*/
|
*/
|
||||||
void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,9 @@ void splitFtpRequest(char* pRequest, char* pCommand, char* pContent){
|
||||||
for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){
|
for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){
|
||||||
|
|
||||||
if( i < firstSpaceIndex ) // première partie (pCommand)
|
if( i < firstSpaceIndex ) // première partie (pCommand)
|
||||||
strcpy( pCommand, strcat(pCommand, (char[2]) { (char) pRequest[i], '\0' }) );
|
strcat( pCommand, (char[2]){(char) pRequest[i], '\0'});
|
||||||
if( i > firstSpaceIndex ) // seconde partie (pContent)
|
if( i > firstSpaceIndex ) // seconde partie (pContent)
|
||||||
strcpy( pContent, strcat(pContent, (char[2]) { (char) pRequest[i], '\0' }) );
|
strcat( pContent, (char[2]){(char) pRequest[i], '\0'});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,9 +42,9 @@ void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText){
|
||||||
for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){
|
for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){
|
||||||
|
|
||||||
if( i < codeLength ) // première partie (ftpCode)
|
if( i < codeLength ) // première partie (ftpCode)
|
||||||
strcpy( ftpCode, strcat(ftpCode, (char[2]) { (char) pAnswer[i], '\0' }) );
|
strcat(ftpCode, (char[2]){(char)pAnswer[i], '\0' });
|
||||||
if( i > codeLength ) // seconde partie (ftpText)
|
if( i > codeLength ) // seconde partie (ftpText)
|
||||||
strcpy( ftpText, strcat(ftpText, (char[2]) { (char) pAnswer[i], '\0' }) );
|
strcat(ftpText, (char[2]){(char)pAnswer[i], '\0' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ void formatBuffer(char* pBuffer){
|
||||||
revealString(pBuffer);
|
revealString(pBuffer);
|
||||||
/* [2] On ajoute "\r\n" à la fin
|
/* [2] On ajoute "\r\n" à la fin
|
||||||
============================================================*/
|
============================================================*/
|
||||||
strcpy(pBuffer, strcat(pBuffer, "\r\n"));
|
strcat(pBuffer, "\r\n\0");
|
||||||
|
|
||||||
if( DEBUGMOD&BUF ) printf( "BUFLEN (aft): %lu\n", strlen(pBuffer) );
|
if( DEBUGMOD&BUF ) printf( "BUFLEN (aft): %lu\n", strlen(pBuffer) );
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ void read_stdin(char* pBuffer, unsigned long pLength){
|
||||||
while( pBuffer[strlen(pBuffer)-1] == '\r' || pBuffer[strlen(pBuffer)-1] == '\n' )
|
while( pBuffer[strlen(pBuffer)-1] == '\r' || pBuffer[strlen(pBuffer)-1] == '\n' )
|
||||||
pBuffer[strlen(pBuffer)-1] = '\0';
|
pBuffer[strlen(pBuffer)-1] = '\0';
|
||||||
|
|
||||||
strcpy(pBuffer, strcat(pBuffer, "\r\n\0"));
|
strcat(pBuffer, "\r\n\0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
77
proxy_ftp.c
77
proxy_ftp.c
|
@ -2,10 +2,11 @@
|
||||||
|
|
||||||
// DECLARATIONS
|
// DECLARATIONS
|
||||||
static pthread_t managers[maxListLen];
|
static pthread_t managers[maxListLen];
|
||||||
|
static int activeManagers = 0x00;
|
||||||
|
|
||||||
/* headers */
|
/* headers */
|
||||||
static void* testServer();
|
static void* testServer();
|
||||||
|
void* manageConnection(void* THREADABLE_SOCKET);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,21 +41,14 @@ int main(int argc, char* argv[]){
|
||||||
|
|
||||||
|
|
||||||
static void* testServer(char* localPort){
|
static void* testServer(char* localPort){
|
||||||
int USER_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur
|
int THREADABLE_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur à envoyer à un THREAD
|
||||||
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
|
|
||||||
|
|
||||||
char BUFFER[maxBuffLen]; // contiendra le BUFFER
|
|
||||||
struct sockaddr_storage clientInfo; // contiendra les infos client
|
struct sockaddr_storage clientInfo; // contiendra les infos client
|
||||||
char repeat; // sert à sortir de la boucle
|
char repeat; // sert à sortir de la boucle
|
||||||
int nbReceived, nbSend; // contiendra les nb reçu && envoyé
|
|
||||||
socklen_t len = sizeof(struct sockaddr_storage);
|
socklen_t len = sizeof(struct sockaddr_storage);
|
||||||
|
|
||||||
// retour de @DROP_SERVER
|
// retour de @DROP_SERVER
|
||||||
char* serverPort; // contiendra le port
|
char* serverPort; // contiendra le port
|
||||||
int LISTENSOCK; // contiendra la socket d'écoute
|
int LISTENSOCK; // contiendra la socket d'écoute
|
||||||
char* ftp_response;
|
|
||||||
|
|
||||||
/* [0] On démarre le SERVEUR + le CLIENT
|
/* [0] On démarre le SERVEUR + le CLIENT
|
||||||
==========================================================*/
|
==========================================================*/
|
||||||
|
@ -71,10 +65,63 @@ static void* testServer(char* localPort){
|
||||||
|
|
||||||
/* [1] Attente d'une demande de connection, puis création d'une socket
|
/* [1] Attente d'une demande de connection, puis création d'une socket
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
USER_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len);
|
int index = 0;
|
||||||
|
while( index <= maxListLen ){
|
||||||
|
THREADABLE_SOCKET = -1; // on initialise la SOCKET en attendant la connexion
|
||||||
|
|
||||||
|
THREADABLE_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len);
|
||||||
|
|
||||||
|
// on lance un thread pour le traitement
|
||||||
|
pthread_create(&managers[index], NULL, manageConnection, (void*)(intptr_t) THREADABLE_SOCKET);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for( i = 0 ; i < maxListLen ; i++ )
|
||||||
|
pthread_join(managers[i], NULL);
|
||||||
|
|
||||||
|
printf("FERMETURE DE TOUTES LES CONNECTIONS!\n");
|
||||||
|
close(LISTENSOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// static void* manageConnection(int* USER_SOCKET){
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Gestion d'une connexion client
|
||||||
|
*
|
||||||
|
* @THREADABLE_SOCKET<void*> 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)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void* manageConnection(void* THREADABLE_SOCKET){
|
||||||
|
int USER_SOCKET = (intptr_t) THREADABLE_SOCKET;
|
||||||
|
|
||||||
|
/* [1] Variables
|
||||||
|
============================================================================*/
|
||||||
|
// int USER_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur
|
||||||
|
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
|
||||||
|
|
||||||
|
char BUFFER[maxBuffLen]; // contiendra le BUFFER
|
||||||
|
char* ftp_response; // contiendra le BUFFER de réponse du serveur FTP (commandes)
|
||||||
|
int nbReceived, nbSend; // contiendra les nb reçu && envoyé
|
||||||
|
|
||||||
/* [2] Envoi de la séquence de Bienvenue
|
/* [2] Envoi de la séquence de Bienvenue
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
|
@ -117,8 +164,8 @@ static void* testServer(char* localPort){
|
||||||
|
|
||||||
/* [8] On vide les buffers
|
/* [8] On vide les buffers
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
// memset(BUFFER, '\0', maxBuffLen); // on vide le buffer
|
memset(BUFFER, '\0', maxBuffLen); // on vide le buffer
|
||||||
// memset(ftp_response, '\0', maxBuffLen);
|
memset(ftp_response, '\0', maxBuffLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [9] Fermeture des connections (SOCKETS)
|
/* [9] Fermeture des connections (SOCKETS)
|
||||||
|
@ -126,7 +173,9 @@ static void* testServer(char* localPort){
|
||||||
printf("CLOSING CONNECTIONS\n");
|
printf("CLOSING CONNECTIONS\n");
|
||||||
close(USER_SOCKET);
|
close(USER_SOCKET);
|
||||||
close(FTP_SOCKET);
|
close(FTP_SOCKET);
|
||||||
close(LISTENSOCK);
|
|
||||||
|
// on arrête le THREAD
|
||||||
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* global */
|
/* global */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
#define SOCKETS 0x01 // debug RESEAU
|
#define SOCKETS 0x01 // debug RESEAU
|
||||||
#define COMMAND 0x02 // debug COMMANDES
|
#define COMMANDS 0x02 // debug COMMANDES
|
||||||
#define DATA 0x04 // debug DONNEES
|
#define DATA 0x04 // debug DONNEES
|
||||||
#define REVEALS 0x08 // debug EXPLICITATION des strings
|
#define REVEALS 0x08 // debug EXPLICITATION des strings
|
||||||
#define BUFFERS 0x10 // debug des BUFFERS
|
#define BUFFERS 0x10 // debug des BUFFERS
|
||||||
|
@ -30,8 +31,7 @@
|
||||||
#define HDR 0x20 // FILTRE pour ONLY_HEADERS
|
#define HDR 0x20 // FILTRE pour ONLY_HEADERS
|
||||||
|
|
||||||
// possibilité de cumuler les DEBUGMODES
|
// possibilité de cumuler les DEBUGMODES
|
||||||
/* DEBUGMOD ONLY_COMMAND + ONLY_DATA + .. */
|
#define DEBUGMOD COMMANDS // REVEALS + HEADER
|
||||||
#define DEBUGMOD COMMAND // REVEALS + HEADER
|
|
||||||
|
|
||||||
|
|
||||||
/* vars */
|
/* vars */
|
||||||
|
|
Loading…
Reference in New Issue