usr@srv presque totalement opérationnel, encore pb de buffer au niveau du -->LIST et des fois à la co + core dump si mauvais serveur
This commit is contained in:
parent
a61bb83c3a
commit
5cb2b373b4
116
dep/client.c
116
dep/client.c
|
@ -1,115 +1,13 @@
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
|
|
||||||
|
int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
|
||||||
|
if( DEBUGMOD&HDR ) printf("====== CONNECT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer){
|
|
||||||
if( DEBUGMOD&HDR ) printf("====== CLIENT_REQUEST(%s, %s, %s, %s) ======\n\n", serverHost, serverPort, pRequest, *pAnswer);
|
|
||||||
|
|
||||||
struct addrinfo hints; // contiendra le filtre/format
|
|
||||||
struct addrinfo* addrinfo; // contiendra les infos
|
|
||||||
int SOCKET, CONNECT; // file_desc(s)
|
|
||||||
char BUFFER[maxBuffLen]; // BUFFER de communication
|
|
||||||
// char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur)
|
|
||||||
|
|
||||||
/* [1] On définit le filtre/format
|
|
||||||
=======================================================*/
|
|
||||||
memset(&hints, 0, sizeof(struct addrinfo)); // on vide le filtre
|
|
||||||
hints.ai_family = AF_UNSPEC; // Allow IPv4 ou IPv6
|
|
||||||
hints.ai_socktype = SOCK_STREAM; // TCP (SOCK_DGRAM = UDP)
|
|
||||||
hints.ai_flags = 0; // non spécifié
|
|
||||||
hints.ai_protocol = 0; // non spécifié
|
|
||||||
|
|
||||||
if( DEBUGMOD&SCK ) printf("============HINTS===========\n");
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf("\n");
|
|
||||||
|
|
||||||
|
|
||||||
/* [2] On récupère les infos
|
|
||||||
=======================================================*/
|
|
||||||
getaddrinfo(serverHost, serverPort, &hints, &addrinfo);
|
|
||||||
|
|
||||||
if( DEBUGMOD&SCK ) printf("=============RES============\n");
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int
|
|
||||||
if( DEBUGMOD&SCK ) printf("\n");
|
|
||||||
|
|
||||||
/* [3] Création de la socket
|
|
||||||
=======================================================*/
|
|
||||||
SOCKET = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0);
|
|
||||||
|
|
||||||
if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", SOCKET);
|
|
||||||
|
|
||||||
// si erreur
|
|
||||||
if( SOCKET == -1 ) return;
|
|
||||||
|
|
||||||
/* [4] On établit la connection
|
|
||||||
=======================================================*/
|
|
||||||
CONNECT = connect(
|
|
||||||
SOCKET,
|
|
||||||
addrinfo->ai_addr,
|
|
||||||
addrinfo->ai_addrlen
|
|
||||||
);
|
|
||||||
|
|
||||||
if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT);
|
|
||||||
|
|
||||||
// si erreur
|
|
||||||
if( CONNECT == -1 ) return;
|
|
||||||
|
|
||||||
// on a plus besoin des infos de l'adresse
|
|
||||||
freeaddrinfo(addrinfo);
|
|
||||||
|
|
||||||
|
|
||||||
/* [5] On écrit sur la socket
|
|
||||||
=======================================================*/
|
|
||||||
int nbSend = swrite(&SOCKET, pRequest);
|
|
||||||
|
|
||||||
if( DEBUGMOD&BUF ) printf("nbSend: %d\n", nbSend);
|
|
||||||
if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest);
|
|
||||||
|
|
||||||
// si pas tout envoyé
|
|
||||||
if( strlen(pRequest) != nbSend ) return;
|
|
||||||
|
|
||||||
/* [6] On lit la réponse
|
|
||||||
=======================================================*/
|
|
||||||
// memset(BUFFER, '\0', sizeof(BUFFER)); // on vide le buffer
|
|
||||||
int nbRecup = sread(&SOCKET, BUFFER);
|
|
||||||
|
|
||||||
*pAnswer = malloc( maxBuffLen );
|
|
||||||
strcpy(*pAnswer, BUFFER);
|
|
||||||
|
|
||||||
if( DEBUGMOD&BUF ) printf("nbReceived: %d\n", nbRecup);
|
|
||||||
if( DEBUGMOD&BUF ) printf("Message: %s\n", *pAnswer);
|
|
||||||
|
|
||||||
|
|
||||||
/* [7] On ferme la connection
|
|
||||||
=======================================================*/
|
|
||||||
int closeState = close(SOCKET);
|
|
||||||
|
|
||||||
// if( closeState == -1 ) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
|
|
||||||
if( DEBUGMOD&HDR ) printf("====== INIT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket);
|
|
||||||
|
|
||||||
struct addrinfo hints; // contiendra le filtre/format
|
struct addrinfo hints; // contiendra le filtre/format
|
||||||
struct addrinfo* addrinfo; // contiendra les infos
|
struct addrinfo* addrinfo; // contiendra les infos
|
||||||
int CONNECT; // file_desc(s)
|
int CONNECT; // file_desc(s)
|
||||||
char BUFFER[maxBuffLen]; // BUFFER de communication
|
char BUFFER[maxBuffLen]; // BUFFER de communication
|
||||||
// char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur)
|
|
||||||
|
|
||||||
/* [1] On définit le filtre/format
|
/* [1] On définit le filtre/format
|
||||||
=======================================================*/
|
=======================================================*/
|
||||||
|
@ -147,7 +45,7 @@ void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
|
||||||
if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", *pSocket);
|
if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", *pSocket);
|
||||||
|
|
||||||
// si erreur
|
// si erreur
|
||||||
if( *pSocket == -1 ) return;
|
if( *pSocket == -1 ) return -1;
|
||||||
|
|
||||||
/* [4] On établit la connection
|
/* [4] On établit la connection
|
||||||
=======================================================*/
|
=======================================================*/
|
||||||
|
@ -160,15 +58,17 @@ void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){
|
||||||
if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT);
|
if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT);
|
||||||
|
|
||||||
// si erreur
|
// si erreur
|
||||||
if( CONNECT == -1 ) return;
|
if( CONNECT == -1 ) return -1;
|
||||||
|
|
||||||
// on a plus besoin des infos de l'adresse
|
// on a plus besoin des infos de l'adresse
|
||||||
freeaddrinfo(addrinfo);
|
freeaddrinfo(addrinfo);
|
||||||
|
|
||||||
|
return *pSocket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){
|
int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){
|
||||||
if( DEBUGMOD&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *pSocket, pRequest, *pAnswer);
|
if( DEBUGMOD&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *pSocket, pRequest, *pAnswer);
|
||||||
char BUFFER[maxBuffLen] = {0};
|
char BUFFER[maxBuffLen] = {0};
|
||||||
|
|
||||||
|
@ -180,7 +80,7 @@ void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){
|
||||||
if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest);
|
if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest);
|
||||||
|
|
||||||
// si pas tout envoyé
|
// si pas tout envoyé
|
||||||
if( strlen(pRequest) != nbSend ) return;
|
if( strlen(pRequest) != nbSend ) return -1;
|
||||||
|
|
||||||
/* [6] On lit la réponse
|
/* [6] On lit la réponse
|
||||||
=======================================================*/
|
=======================================================*/
|
||||||
|
|
13
dep/client.h
13
dep/client.h
|
@ -2,16 +2,13 @@
|
||||||
*
|
*
|
||||||
* @serverHost<char*> Nom de l'hôte distant (server)
|
* @serverHost<char*> Nom de l'hôte distant (server)
|
||||||
* @serverPort<char*> Numéro du port distant (server)
|
* @serverPort<char*> Numéro du port distant (server)
|
||||||
* @pRequest<char*> Requête à envoyer au serveur
|
* @pSocket<int*> Pointeur sur la requête à créer
|
||||||
*
|
*
|
||||||
* @pAnswer<char**> Pointeur sur le <char*> à remplir => contiendra la réponse du serveur
|
|
||||||
*
|
*
|
||||||
|
* @return error<int> retourne -1 en cas d'erreur, sinon la SOCKET
|
||||||
*/
|
*/
|
||||||
void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer);
|
int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket);
|
||||||
|
|
||||||
|
|
||||||
|
// retourne -1 en cas d'erreur
|
||||||
void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket);
|
int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer);
|
||||||
|
|
||||||
|
|
||||||
void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer);
|
|
71
dep/server.c
71
dep/server.c
|
@ -127,30 +127,71 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket){
|
||||||
// CMD: CLIENT (SRV) PROXY (CLT) FTP
|
// CMD: CLIENT (SRV) PROXY (CLT) FTP
|
||||||
// DTA: CLIENT (CLT) PROXY (CLT) FTP
|
// DTA: CLIENT (CLT) PROXY (CLT) FTP
|
||||||
//
|
//
|
||||||
void MANAGE_REQUEST(char* pRequest, 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) ======\n\n", pRequest, *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 answer[maxBuffLen]; // contiendra la réponse
|
|
||||||
|
char response[maxBuffLen]; // contiendra la réponse
|
||||||
int nbSend; // contiendra le nombre de données envoyées
|
int nbSend; // contiendra le nombre de données envoyées
|
||||||
char rCommand[10]; // 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)
|
||||||
|
|
||||||
// on vide les buffers
|
// on vide les buffers
|
||||||
memset(&rCommand, '\0', sizeof(rCommand));
|
memset(&rCommand, '\0', sizeof(rCommand));
|
||||||
memset(&rContent, '\0', sizeof(rContent));
|
memset(&rContent, '\0', sizeof(rContent));
|
||||||
memset(&answer, '\0', sizeof(answer));
|
memset(&response, '\0', sizeof(response));
|
||||||
|
|
||||||
|
|
||||||
/* [1] On découpe la requête en 2 parties
|
/* [1] On découpe la requête en 2 parties
|
||||||
================================================*/
|
================================================*/
|
||||||
splitFtpRequest(pRequest, rCommand, rContent);
|
splitFtpRequest(pRequest, rCommand, rContent);
|
||||||
|
|
||||||
|
|
||||||
/* [2] Selection en fonction de @rCommand
|
/* [2] Selection en fonction de @rCommand
|
||||||
================================================*/
|
================================================*/
|
||||||
|
|
||||||
/* (1) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif)
|
/* (1) USER username@serveur => connection FTP (commande)
|
||||||
--------------------------------------------*/
|
--------------------------------------------*/
|
||||||
if( strcmp(rCommand, "PORT") == 0 ){
|
if( strcmp(rCommand, "USER") == 0 && indexOf(rContent, '@') >= 0 ){
|
||||||
|
char userName[maxBuffLen] = {0};
|
||||||
|
char hostName[maxHostLen] = {0};
|
||||||
|
|
||||||
|
sscanf(rContent, "%[^@]@%s\r\n", userName, hostName);
|
||||||
|
|
||||||
|
|
||||||
|
if( DEBUGMOD&BUF ) printf("USERNAME [[%s]]\n", userName);
|
||||||
|
if( DEBUGMOD&BUF ) printf("HOSTNAME [[%s]]\n", hostName);
|
||||||
|
|
||||||
|
/* On se connecte au serveur FTP (commandes) */
|
||||||
|
CONNECT_CLIENT(hostName, FTP_PORT, FTP_SOCKET);
|
||||||
|
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);
|
||||||
|
|
||||||
|
/* 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");
|
||||||
|
CLIENT_SEND(FTP_SOCKET, BUFFER, &ftp_response);
|
||||||
|
|
||||||
|
if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER);
|
||||||
|
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"));
|
||||||
|
|
||||||
|
strcpy(response, "USER xdrm\r\n");
|
||||||
|
printf("RESP: [[%s]]\n", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif)
|
||||||
|
--------------------------------------------*/
|
||||||
|
else if( strcmp(rCommand, "PORT") == 0 ){
|
||||||
int a1, a2, a3, a4 = 0;
|
int a1, a2, a3, a4 = 0;
|
||||||
int p1, p2 = 0;
|
int p1, p2 = 0;
|
||||||
|
|
||||||
|
@ -171,19 +212,23 @@ void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_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
|
// on envoie PASV car on veut être en mode passif entre le proxy et le serveur FTP
|
||||||
strcpy(pRequest, "PASV\r\n");
|
strcpy(response, "PASV\r\n");
|
||||||
}
|
}
|
||||||
// WAIT_SOCKET_UPDATE(DFTP_SOCKET, BUFFER);
|
|
||||||
// xPrint("FTPLIST: %s\n", BUFFER);
|
|
||||||
|
|
||||||
/* [3] Envoi de la réponse
|
/* (n) Si aucun traitement on recopie la requête telquel
|
||||||
|
--------------------------------------------*/
|
||||||
|
else
|
||||||
|
strcpy(response, pRequest);
|
||||||
|
|
||||||
|
/* [3] Retour de la réponse
|
||||||
================================================*/
|
================================================*/
|
||||||
|
strcpy(pRequest, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void MANAGE_RESPONSE(int* USER_SOCKET, int* FTP_SOCKET, char* pAnswer, int* DUSER_SOCKET, int* DFTP_SOCKET){
|
void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){
|
||||||
if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%d, %s, %d, %d) ======\n\n", *USER_SOCKET, pAnswer, *DUSER_SOCKET, *DFTP_SOCKET);
|
if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%s, %d, %d, %d, %d) ======\n\n", pAnswer, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET);
|
||||||
|
|
||||||
char response[maxBuffLen]; // contiendra la réponse
|
char response[maxBuffLen]; // contiendra la réponse
|
||||||
char ftpCodeStr[4]; // contiendra le code FTP (1ère partie)
|
char ftpCodeStr[4]; // contiendra le code FTP (1ère partie)
|
||||||
|
|
|
@ -13,6 +13,8 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket);
|
||||||
/* Gestion de la requête du client
|
/* Gestion de la requête du client
|
||||||
*
|
*
|
||||||
* @pBuffer<char*> Requête en question
|
* @pBuffer<char*> Requête en question
|
||||||
|
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
|
||||||
|
* @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
|
||||||
*
|
*
|
||||||
|
@ -21,13 +23,15 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket);
|
||||||
* [2]
|
* [2]
|
||||||
* [3]
|
* [3]
|
||||||
*/
|
*/
|
||||||
void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Gestion de la réponse du serveur FTP et modification de la réponse
|
/* Gestion de la réponse du serveur FTP et modification de la réponse
|
||||||
*
|
*
|
||||||
* @pAnswer<char**> Pointeur sur le buffer de réponse du serveur FTP
|
* @pAnswer<char**> Pointeur sur le buffer de réponse du serveur FTP
|
||||||
|
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
|
||||||
|
* @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
|
||||||
*
|
*
|
||||||
|
@ -43,7 +47,7 @@ void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
||||||
* [4] SI 226, on ferme les SOCKETS du BUS DE DONNEES
|
* [4] SI 226, on ferme les SOCKETS du BUS DE DONNEES
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void MANAGE_RESPONSE(int* USER_SOCKET, int* FTP_SOCKET, char* pAnswer, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -114,13 +114,12 @@ int swrite(int* pSocket, char* pBuffer){
|
||||||
// formatBuffer(pBuffer);
|
// formatBuffer(pBuffer);
|
||||||
|
|
||||||
|
|
||||||
/* 2. On evoie le Buffer */
|
/* 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. On vérifie que le retour est correct */
|
/* 3. Si on est déconnecté, on retourne une erreur */
|
||||||
// si on est déconnecté, on ferme la SOCKET
|
|
||||||
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
|
||||||
|
@ -140,13 +139,16 @@ int sread(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
|
||||||
|
|
||||||
|
|
||||||
// on vide le buffer avant de lire
|
/* 1. On vide le buffer avant de lire */
|
||||||
memset(pBuffer, '\0', maxBuffLen);
|
memset(pBuffer, '\0', maxBuffLen);
|
||||||
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
|
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
|
||||||
|
|
||||||
|
/* 2. On lit la SOCKET */
|
||||||
int nbRead = read(*pSocket, pBuffer, maxBuffLen);
|
int nbRead = read(*pSocket, pBuffer, maxBuffLen);
|
||||||
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
|
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
|
||||||
|
|
||||||
// si on est déconnecté, on ferme la SOCKET
|
|
||||||
|
/* 3. Si on est déconnecté, on retourne une erreur */
|
||||||
if( nbRead <= 0 ){
|
if( nbRead <= 0 ){
|
||||||
if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n");
|
if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n");
|
||||||
return -1; // on retourne une erreur
|
return -1; // on retourne une erreur
|
||||||
|
@ -156,6 +158,7 @@ int sread(int* pSocket, char* pBuffer){
|
||||||
if( DEBUGMOD&RVL ) revealString(pBuffer);
|
if( DEBUGMOD&RVL ) revealString(pBuffer);
|
||||||
if( DEBUGMOD&RVL ) printf("READ_2\n");
|
if( DEBUGMOD&RVL ) printf("READ_2\n");
|
||||||
|
|
||||||
|
/* 4. On retourne le nombre de caractères lus */
|
||||||
return nbRead;
|
return nbRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
41
proxy_ftp.c
41
proxy_ftp.c
|
@ -1,9 +1,7 @@
|
||||||
#include "proxy_ftp.h"
|
#include "proxy_ftp.h"
|
||||||
|
|
||||||
// DECLARATIONS
|
// DECLARATIONS
|
||||||
static pthread_t userServer;
|
static pthread_t managers[maxListLen];
|
||||||
static short unsigned int userServerState = 1;
|
|
||||||
static char remoteAssignedPort[maxPortLen] = {'\0'};
|
|
||||||
|
|
||||||
/* headers */
|
/* headers */
|
||||||
static void* testServer();
|
static void* testServer();
|
||||||
|
@ -42,10 +40,10 @@ int main(int argc, char* argv[]){
|
||||||
|
|
||||||
|
|
||||||
static void* testServer(char* localPort){
|
static void* testServer(char* localPort){
|
||||||
int USER_SOCKET; // contiendra le BUS DE COMMANDE utilisateur
|
int USER_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur
|
||||||
int FTP_SOCKET; // contiendra le BUS DE COMMANDE FTP
|
int FTP_SOCKET = -1; // contiendra le BUS DE COMMANDE FTP
|
||||||
int DUSER_SOCKET; // contiendra le BUS DE DONNES utilisateur
|
int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur
|
||||||
int DFTP_SOCKET; // contiendra le BUS DE DONNEES FTP
|
int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP
|
||||||
|
|
||||||
char BUFFER[maxBuffLen]; // contiendra le BUFFER
|
char BUFFER[maxBuffLen]; // contiendra le BUFFER
|
||||||
struct sockaddr_storage clientInfo; // contiendra les infos client
|
struct sockaddr_storage clientInfo; // contiendra les infos client
|
||||||
|
@ -67,27 +65,23 @@ static void* testServer(char* localPort){
|
||||||
|
|
||||||
|
|
||||||
DROP_SERVER(remoteHost, &serverPort, &LISTENSOCK);
|
DROP_SERVER(remoteHost, &serverPort, &LISTENSOCK);
|
||||||
CONNECT_CLIENT(FTP_HOST, FTP_PORT, &FTP_SOCKET);
|
|
||||||
|
|
||||||
printf("Port: %s\n", serverPort);
|
printf("Port: %s\n", serverPort);
|
||||||
strcpy(remoteAssignedPort, serverPort);// PORT GLOBAL
|
|
||||||
|
|
||||||
|
|
||||||
/* [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);
|
USER_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len);
|
||||||
|
|
||||||
/* [2] On envoie la séquence d'initialisation
|
|
||||||
============================================================================*/
|
|
||||||
strcpy(BUFFER, "");
|
|
||||||
CLIENT_SEND(&FTP_SOCKET, BUFFER, &ftp_response);
|
|
||||||
MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET);
|
|
||||||
swrite(&USER_SOCKET, ftp_response);
|
|
||||||
|
|
||||||
if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER);
|
// static void* manageConnection(int* USER_SOCKET){
|
||||||
if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response);
|
|
||||||
|
/* [2] Envoi de la séquence de Bienvenue
|
||||||
|
============================================================================*/
|
||||||
|
swrite(&USER_SOCKET, WLCM_MSG);
|
||||||
|
|
||||||
/* BOUCLE DE COMMANDES */
|
/* BOUCLE DE COMMANDES */
|
||||||
while( USER_SOCKET != -1 && FTP_SOCKET != -1 ){
|
while( USER_SOCKET != -1 ){
|
||||||
|
|
||||||
/* [3] On récupère les données reçues (+attente)
|
/* [3] On récupère les données reçues (+attente)
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
|
@ -97,7 +91,10 @@ static void* testServer(char* localPort){
|
||||||
|
|
||||||
/* [4] Traitement de la requête
|
/* [4] Traitement de la requête
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
MANAGE_REQUEST(BUFFER, &DUSER_SOCKET, &DFTP_SOCKET);
|
MANAGE_REQUEST(BUFFER, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET);
|
||||||
|
|
||||||
|
// si on a pas la connection FTP (commande) initialisée, on quitte
|
||||||
|
// if( FTP_SOCKET == -1 ) break;
|
||||||
|
|
||||||
|
|
||||||
/* [5] Redirection vers le serveur FTP
|
/* [5] Redirection vers le serveur FTP
|
||||||
|
@ -108,7 +105,7 @@ static void* testServer(char* localPort){
|
||||||
|
|
||||||
/* [6] Traitement de la réponse (FTP)
|
/* [6] Traitement de la réponse (FTP)
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET);
|
MANAGE_RESPONSE(ftp_response, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,10 +123,10 @@ static void* testServer(char* localPort){
|
||||||
|
|
||||||
/* [9] Fermeture des connections (SOCKETS)
|
/* [9] Fermeture des connections (SOCKETS)
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
|
printf("CLOSING CONNECTIONS\n");
|
||||||
close(USER_SOCKET);
|
close(USER_SOCKET);
|
||||||
close(FTP_SOCKET);
|
close(FTP_SOCKET);
|
||||||
close(LISTENSOCK);
|
close(LISTENSOCK);
|
||||||
strcpy(remoteAssignedPort, "\0");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
14
proxy_ftp.h
14
proxy_ftp.h
|
@ -15,12 +15,12 @@
|
||||||
|
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
#define ONLY_SOCKETS 0x01 // debug RESEAU
|
#define SOCKETS 0x01 // debug RESEAU
|
||||||
#define ONLY_COMMAND 0x02 // debug COMMANDES
|
#define COMMAND 0x02 // debug COMMANDES
|
||||||
#define ONLY_DATA 0x04 // debug DONNEES
|
#define DATA 0x04 // debug DONNEES
|
||||||
#define ONLY_REVEALS 0x08 // debug EXPLICITATION des strings
|
#define REVEALS 0x08 // debug EXPLICITATION des strings
|
||||||
#define ONLY_BUFFERS 0x10 // debug des BUFFERS
|
#define BUFFERS 0x10 // debug des BUFFERS
|
||||||
#define ONLY_HEADERS 0x20 // debug des HEADERS de fonctions
|
#define HEADERS 0x20 // debug des HEADERS de fonctions
|
||||||
|
|
||||||
#define SCK 0x01 // FILTRE pour ONLY_SOCKET
|
#define SCK 0x01 // FILTRE pour ONLY_SOCKET
|
||||||
#define CMD 0x02 // FILTRE pour ONLY_COMMAND
|
#define CMD 0x02 // FILTRE pour ONLY_COMMAND
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
// possibilité de cumuler les DEBUGMODES
|
// possibilité de cumuler les DEBUGMODES
|
||||||
/* DEBUGMOD ONLY_COMMAND + ONLY_DATA + .. */
|
/* DEBUGMOD ONLY_COMMAND + ONLY_DATA + .. */
|
||||||
#define DEBUGMOD ONLY_REVEALS
|
#define DEBUGMOD COMMAND // REVEALS + HEADER
|
||||||
|
|
||||||
|
|
||||||
/* vars */
|
/* vars */
|
||||||
|
|
Loading…
Reference in New Issue