---
# System prepended metadata

title: Compte-rendu du TP FTP
tags: [sr, '2021']

---

###### Yanis MIOLLANY
###### Ianis OLIVIER-PACAUD
# Compte-rendu du TP FTP 
###### tags: `sr` `2021`

## Structure du projet

### Les fichiers

![](https://i.imgur.com/pvOKobY.png)


Les fichiers clientFTP.c, client_util.c concerne les fichiers responsable des interactions avec les clients.

Les fichiers serverFTP.c, ftp.c, server_util.c concerne les fichiers responsable des interactions avec le serveur.

Util.c est un fichier qui est utile à la fois pour le serveur que pour le client.

A la racine du projet, il y a deux dossier server/ et client/. Le dossier server/ comprend l'ensemble de la collection des fichiers du serveur.

Le dossier client/ comporte les fichiers récupérés par le serveur.

Dans le cas d'un serveur en localhost, les deux dossiers sont nécessaire. 

Si le serveur n'est pas en localhost, il faut le dossier server/ dans la machine servant de serveur. Ainsi que le dossier client/  dans les fichiers du client.

### Structure de l'exécution du projet

![](https://i.imgur.com/KEFEvXj.png)


## Étape 1 

| Sous-étape                                      | Statut             | Commentaire |
| ----------------------------------------------- | ------------------ | ----------- |
| Port d’écoute du serveur 2121                   | :heavy_check_mark: |             |
| Pool de processus parametré à l’aide de NB_PROC | :heavy_check_mark: |             |
| Terminaison propre du serveur                   | :heavy_check_mark: |             |
| Un fichier par connexion                        | :heavy_check_mark: |             |
| Traitement de la requête côté serveur           | :heavy_check_mark: |             |
| Types de fichiers considérés.                   | :heavy_check_mark: |             |
| Dossiers de stockage des fichiers               | :heavy_check_mark: |             |
| Fin de traitement de requête côté client        | :heavy_check_mark: |             |

## Étape 2

| Sous-étape                                   | Statut             | Commentaire                                                                                                                         |
| -------------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| Découpage du fichier                         | :heavy_check_mark: | Le fichier est envoyé en paquet de taille MAX_SIZE ou bien le fichier est envoyé directement si sa taille est inférieure à MAX_SIZE |
| Plusieurs demandes de fichiers par connexion | :heavy_check_mark: |                                                                                                                                     |
| Gestion des pannes coté client               | :heavy_minus_sign: | Voir remarques ci-dessous                                                                                                           |

#### Remarques :

A la fin de la réalisation du projet, nous avons rajouté des sécurités dans le cas où le fichier demandé n'existait pas ou bien que l'ouverture d'un fichier ne fonctionnait pas.
Cependant, cet ajout a entrainé un sorte de conflit d'adresse lors de l'envoie de la taille du fichier client au serveur mais seulement lorsque le client venait de crasher. 
Normalement le client, qui a précédemment crasher, se reconnecte et le transfert reprends. 
Or, dû à ce conflit, la reprise du transfert échouait (cf : capture d'écran ci-dessous).
![](https://i.imgur.com/r9WHJ98.png)

Cependant, si l'on souhaite reprendre le transfert du fichier en entrant "get nom-du-fichier" le transfert remarche en ne reprenant que les données qu'il nous manquait.


### Étape 3

La répartition de charge entre serveurs FTP a été commencé mais ne fonctionnait pas efficacement. 
Cette étape n'a donc pas été conservée pour le rendu.

-----

Ce que nous avions prévu de faire pour l'étape 3 est :
- Pour le slave :
    - Renommer serverFTP.c en slaveFTP.c,
    - Ouvrir un connection avec le serveur sur le port 2122, 
    - Ouvrir un port d'écoute sur le port 2121.

- Pour le serveur : 
    - Recréer un nouveau fichier en partant de serverFTP.c,
    - Supprimer la création des fils et l'appel à FTP,
    - Ouvrir un port d'écoute sur le port 2122 (en plus de 2121),
    - Attendre la connection de chaque serveur slave en récupérant l'addresse de chacun,
    - Faire un while(1) pour attendre un connexion client, 
    - Lors d'un connexion client, récupérer l'addresse IP du serveur slave à qui l'on veut rediriger la connexion,
    - Envoyer au client la nouvelle addresse à laquelle se connecter.
    - Fermer la connexion client

- Pour le client :
    - Partir du même fichier,
    - Rajouter après la connexion au serveur, un readn pour récupérer l'addresse du serveur slave,
    - Fermer la connexion au serveur,
    - Reconnecter le client au serveur esclave sur le port 2121,
    - Continuer le service comme avant mais avec un nouveau serveur.

## Lancement et test

Pour démarrer le serveur, lancer dans un terminal l'exécutable à l'aide de la commande `./serverFTP`.

Pour démarrer le client, utiliser la commande `./clientFTP <adresse de l'hote>` où l'adresse de l'hôte doit être localhost en local.

Sur l'interface client, vous pouvez entrer des commandes dont `get <nom fichier>` pour récupérer un fichier du serveur et `bye` pour se déconnecter.

Pour tester le transfert de fichier, vous avez à disposition 3 fichiers texte de taille variable (msg, hamlet et lotr). Ainsi qu'un pdf, une vidéo et deux images (png et jpg).
