#include "proxy_ftp.h" // DECLARATIONS static pthread_t userServer; static short unsigned int userServerState = 1; static char remoteAssignedPort[maxPortLen] = {'\0'}; /* headers */ static void* testServer(); /*****************/ /* CORPS DU PROG */ /*****************/ int main(int argc, char* argv[]){ if( argc > 1 ) testServer(argv[1]); else testServer(""); return EXIT_SUCCESS; } static void* testServer(char* localPort){ int USER_SOCKET; // contiendra le BUS DE COMMANDE utilisateur int FTP_SOCKET; // contiendra le BUS DE COMMANDE FTP int DUSER_SOCKET; // contiendra le BUS DE DONNES utilisateur int DFTP_SOCKET; // contiendra le BUS DE DONNEES FTP char BUFFER[maxBuffLen]; // contiendra le BUFFER struct sockaddr_storage clientInfo; // contiendra les infos client char repeat; // sert à sortir de la boucle int nbReceived, nbSend; // contiendra les nb reçu && envoyé socklen_t len = sizeof(struct sockaddr_storage); // retour de @DROP_SERVER char* serverPort; // contiendra le port int LISTENSOCK; // contiendra la socket d'écoute char* ftp_response; /* [0] On démarre le SERVEUR + le CLIENT ==========================================================*/ serverPort = malloc(maxPortLen); if( strlen(localPort) != 0 ) strcpy(serverPort, localPort); DROP_SERVER(remoteHost, &serverPort, &LISTENSOCK); CONNECT_CLIENT(FTP_HOST, FTP_PORT, &FTP_SOCKET); printf("Port: %s\n", serverPort); strcpy(remoteAssignedPort, serverPort);// PORT GLOBAL /* [1] Attente d'une demande de connection, puis création d'une socket ============================================================================*/ 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); xPrint("P->F: %s\n\n", BUFFER); xPrint("F->P: %s\n", ftp_response); /* BOUCLE DE COMMANDES */ while( USER_SOCKET != -1 && FTP_SOCKET != -1 ){ /* [3] On récupère les données reçues (+attente) ============================================================================*/ if( WAIT_SOCKET_UPDATE(&USER_SOCKET, BUFFER) == -1 ) break; xPrint("C->P: %s\n", BUFFER); if( DEBUGMOD ) printf("Recu: %d\n", nbReceived); if( DEBUGMOD ) printf("C->P: %s\n", BUFFER); /* [4] Traitement de la requête ============================================================================*/ MANAGE_REQUEST(BUFFER, &DUSER_SOCKET, &DFTP_SOCKET); /* [5] Redirection vers le serveur FTP ============================================================================*/ xPrint("P->F: %s\n\n", BUFFER); CLIENT_SEND(&FTP_SOCKET, BUFFER, &ftp_response); xPrint("F->P: %s\n", ftp_response); /* [6] Traitement de la réponse (FTP) ============================================================================*/ MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET); /* [7] Redirection vers le CLIENT ============================================================================*/ if( swrite(&USER_SOCKET, ftp_response) == -1 ) break; printf("P->C: %s\n", ftp_response); /* [8] On vide les buffers ============================================================================*/ memset(BUFFER, '\0', maxBuffLen); // on vide le buffer memset(ftp_response, '\0', maxBuffLen); } /* [9] Fermeture des connections (SOCKETS) ============================================================================*/ close(USER_SOCKET); close(FTP_SOCKET); close(LISTENSOCK); strcpy(remoteAssignedPort, "\0"); } /* * DROP_SERVER * INIT_CLIENT * * while(){ * accept(); * client_send() * } * * EXIT_CLIENT * HALT_SERVER * * * * * * * * */