/* Créé et met un serveur sur écoute * * ==IN== * @serverHost Nom de l'hôte local (localhost) * @givenPort Si renseigné, définit le port à utiliser * * ==OUT== * @givenPort Pointeur sur le à remplir => contiendra le port donné par le système (si pas renseigné en entrée) * @listenSocket Pointeur sur le à 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(const char* serverHost, char** givenPort, int* listenSocket); /* Gestion de la requête du client * ==IN/OUT== * @pBuffer Requête en question * @USER_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur * @FTP_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @DUSER_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DFTP_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES FTP * * * * @history * [1] On découpe la requête en 2 parties (rCommand, rContent) * [2] Selection en fonction de @rCommand * (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 requête * 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 * */ int 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 * * @pAnswer Pointeur sur le buffer de réponse du serveur FTP * @USER_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur * @FTP_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @DUSER_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DFTP_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES FTP * * * * @history * [1] On découpe la requête en 2 parties (ftpCode, ftpText) * [2] Selection en fonction de @ftpCode * (1) 220- Demande d'username * (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 * 1. On récupère l'ip et le port de la réponse * 2. Connexion au serveur FTP * 3. Envoi du message de code 200 * * (8) 150- On lit la SOCKET FTP du BUS DE DONNEES * 1. Envoi au client de l'écoute de la réponse (associée) du BUS DE DONNEES * 2. On lit la SOCKET FTP (BUS DE DONNEES) * 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) * (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); /* Attends une réponse du client * * @pSocket Pointeur sur la SOCKET en question * @pBuffer Buffer qui contiendra la réponse * * @return nbRead On retourne le nombre de char lus, sinon -1 si erreur * * * * @history * [1] On read() tant qu'on a pas les symboles de fin "\r\n" * [2] On écrit sur le BUFFER * [3] Si une erreur se produit, on retourne -1 * */ int WAIT_CLIENT(int* pSocket, char* pBuffer);