2009-09-04 16 views
2

Je travaille sur un simple serveur ftp dans c. Je ne sais pas quand le serveur FTP accepte la connexion de données passive du client. À ma connaissance ici est de savoir comment fonctionne ftp passif:Quand le serveur FTP accepte-t-il la connexion de données passive du client?

  1. client envoie la commande « PASV » au serveur
  2. serveur crée et se lie à une prise, et écoute sur un port aléatoire.
  3. serveur
  4. utilise getsockname pour obtenir le port aléatoire
  5. assemblez message de réponse passive au format: 227 Entrée en mode passif (a1, a2, a3, a4, a5, a6). Remarque: le serveur ip est a1.a2.a3.a4 et le numéro de port est: a5 * 256 + a6.

ma question est: quand le serveur ftp accepte-t-il la connexion au dit port aléatoire? le serveur doit-il accepter la connexion de données après avoir envoyé une réponse? ou le serveur ftp doit-il accepter la connexion juste avant que la connexion de données ne soit nécessaire, c'est-à-dire lorsque le client demande un fichier?

J'ai RFC959. Y at-il une autre ressource ftp utile là-bas? Google n'est pas particulièrement utile.

merci à l'avance

Répondre

5

Je voudrais que le serveur commence à accepter les connexions sur ce port (en appelant listen()) avant en envoyant la réponse 227. Si vous attendez après avoir envoyé le 227, le client peut essayer de se connecter avant d'accepter les connexions, et obtenir une erreur «connexion refusée». Après l'appel listen() qui démarre l'écoute du système TCP, vous pouvez appeler accept() dès que vous êtes prêt à commencer à accepter les connexions

Quand appeler c'est une décision au niveau de l'application (mais évidemment une fois que le client envoie une commande de transfert de données, il voudra se connecter). Les connexions du client attendent dans une file d'attente d'acceptation jusqu'à ce que le serveur appelle réellement accept(), ce qui les supprime de la file d'attente d'acceptation.

+0

c'est ce que vous vouliez dire: 1. le client envoie "pasv" 2. le serveur envoie la réponse avec l'ip et le port et commence à écouter 3. le client envoie "obtiennent le nom de fichier" 4. les appels de serveur acceptent() et envoient le dossier laissez-moi savoir si je comprends correctement – Quincy

+1

C'est correct. Tant que vous appelez 'listen()' avant d'envoyer la réponse 227, cela devrait vous convenir. Vous pouvez tester cela en retardant quelques secondes après avoir reçu la commande GET, juste pour vous assurer que le client n'abandonnera pas avant que vous ayez une chance de 'accepter()'. –

1

Il ouvrira ce port que lorsqu'un transfert est requis par le client. Le serveur (qui doit connaître sa propre adresse IP externe) indiquera ensuite au client où se connecter, y compris IP (4 octets) et port (dans 2 octets séparés) afin qu'il puisse transférer les données. Quelque chose dans ce format:

printf("227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\n", 
(unsigned int)((my_ip >> 24) & 0xff), 
(unsigned int)((my_ip >> 16) & 0xff), 
(unsigned int)((my_ip >> 8) & 0xff), 
(unsigned int)(my_ip & 0xff), 
(unsigned int)(this_session->pasv_port >> 8), 
(unsigned int)(this_session->pasv_port & 0xff)); 

Le port est utilisé lorsque l'utilisateur nécessite une liste, RETR, STOR ou une autre transfering.

Je suppose que le client en mode passif aura toujours besoin de PASV avant tout LIST, RETR ou STOR, pour effectuer des transferts simultanés.

Je vous recommande d'installer et d'étudier FileZilla Client and Server. Ils montrent tous les deux le FTP cru parlant ainsi vous pouvez comprendre ce qui se passe et ce qui devrait arriver pour votre programme.

Questions connexes