123 lines
4.2 KiB
C
123 lines
4.2 KiB
C
|
/* Créé et met un serveur sur écoute
|
||
|
*
|
||
|
* ==IN==
|
||
|
* @serverHost<char*> Nom de l'hôte local (localhost)
|
||
|
* @givenPort<char**> Si renseigné, définit le port à utiliser
|
||
|
*
|
||
|
* ==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
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* @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<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
|
||
|
* @DFTP_SOCKET<int*> 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<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
|
||
|
* @DFTP_SOCKET<int*> 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<int*> Pointeur sur la SOCKET en question
|
||
|
* @pBuffer<char*> Buffer qui contiendra la réponse
|
||
|
*
|
||
|
* @return nbRead<int> 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);
|