Serveur FTP

simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006 - 31 déc. 2004 à 18:25
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006 - 25 janv. 2005 à 20:21
Salut tout le monde ! J'ai pour projet de faire un serveur FTP pour un réseau local, afin d'éviter de passer par l'explorateur Windows, et pour enrichir mes compétences de prgrammation.

J'aimerais savoir si je dois utiliser les sockets "pures" ou les Winsocks (serveur sous Windows), et comment gérer les connexions multiples. C'est ce dernier point que je trouve très important. J'aimerais aussi savoir comment effectuer le transfert de fichiers : tout d'un bloc, ou morceaux par morceaux ?

Pour ce qui est des references pour le protocole FTP, j'ai déjà : les RFC et le site www.salemioche.com

Merci

11 réponses

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
31 déc. 2004 à 20:34
Euh, perso, j'opterais pour une connexion client/server standard, genre en connection-less (UDP) puisqu'il s'agit d'un résau local...jme suis aussi posé la question du transfert de fichier pour un autre style d'appli ^^....et ne connaissant pas un protocole ou une fonction qui fait tout le boulot, j'ai pensé à faire tout simplement des envois successifs de données, donc d'envoyer le fichier par paquets de données (morceaux)...genre tu connectes à ton server, tu lui envoie une commande qui spécifie que tu veux télécharger ou uploader tel ou tel fichier et apres tu te retrouve avec une fonction du type :

char buffer[500];
ZeroMemory(buffer, sizeof(buffer));

DWORD dwSize = GetFileSize(nom_fichier, 0);
DWORD dwSended = 0;

tant ke fichier pas fini {

sendto(sock, buffer, 500, 0, (SOCKADDR*) &addr, sizeof(addr));
dwSended += 500;
}

Tu vois, un truc dans ce genre la...:-) si tu as des questions, je ne suis pas un expert, bien au contraire, mais je me ferai une joie de t'aider si je le peut, donc n'hésite pas à m'envoyer des messages en privé :)

Bonne soirée, et pour ceux qui aiment la nouvelle année, Joyeuse année 2005....

++

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
1 janv. 2005 à 16:06
Au stadard, FTP se base sur TCP. Pour faire plus léger, il existe TFTP qui se base sur UDP. Si tu veux utiliser un client (genre freeware, shareware, etc...) il te faut un serveur codé selon le standard. D'ailleurs, TCP te simplifie bcp la vie car tu n'as pas besoin de gérer le fragmentation de ton fichier.... j'avais comme projet perso de coder un serveur ftp. Projet laissé en suspens. Si tu as besoin d'un coup de main !

Cordialement,
Xterminhate.
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
1 janv. 2005 à 17:11
Merci les gars : sachez que toute aide est la bienvenue, car la programmation, c'est avant tout un esprit d'entre-aide.

J'ai justement besoin d'un conseil : comment faire pour pouvoir gérer plusieurs connexions en même temps, sachant que j'aurais une vingtaine de connexions simultanées possibles.

J'avais pensé faire un classe pour le dialogue avec un client, et créer un thread par client, mais je sais pas si ça irait, ni comment l'implanter réellement.
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
1 janv. 2005 à 20:34
Qu'est-ce que t'entends par :

"TCP te simplifie bcp la vie car tu n'as pas besoin de gérer le fragmentation de ton fichier"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
1 janv. 2005 à 22:53
TCP garantit le bon acheminement des données quelque soit leur taille. Si un fragment est perdu durant l'émission de ton fichier, TCP assure la réémission. Si les fragments sont déséquencés, TCP assure le réordonnancement à la réception. Etc...

UDP n'assure pas ces services, par définition.

Si tu utilises UDP, c'est à toi de mettre en oeuvre les mécanismes qui vont garantir le bon acheminement des données à travers le réseau. Dans un LAN les risques sont faibles, mais via Internet ou tout autre WAN, c'est indispensables.

Par contre, si tu utilises TCP, tu n'as rien d'autre à faire qu'un vieux send(). Tu pourras donc te concentrer sur l'implémentation du protocole FTP et oublier les problèmes réseaux.

Cordialement,
Xterminhate.
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
2 janv. 2005 à 12:45
Effectivement, d'après ta description, le TCP semble être le plus simple à utiliser dans ce genre de transmissions.

Cela dit, est-ce que je peux enoyer un fichier de 600 Mo (image d'un disque), en un seul bloc.

Je pense que le partager en morceaux de 1 Mo serait plus intelligent (au niveau de la mémoire du serveur), mais je ne sais pas quelle serait la taille optimale pour transmettre un fichier.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
2 janv. 2005 à 23:45
Un coup de getsockopt avec l'option SO_SNDBUF te permet de connaitre la taille maximale du buffer d'émission. Cela fixe la taille des fragments de tes gros fichiers au moment de l'appel de send().

Cordialement,
Xterminhate.
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
8 janv. 2005 à 11:42
Merci pour votre aide, les gars!



Encore quelques questions :

1°/ quel type de chaines de caractères dois-je utiliser : ANSI : char*, UNICODE : wchar_t* ou GENERIQUE : TCHAR* ?



2°/ lors du dialogue avec le client, dois-je créer une fonction par
commande du protocole FTP, avec une fonction principale de dialogue,
appelant les autres en temps voulu, ou bien tout faire dans la même
fonction ?



Merci
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
8 janv. 2005 à 13:01
Dites, est-ce qu'il y a un moyen d'écrire "..." au lieu de L"..." quand on veut faire de l'UNICODE.

(finalement, c'est ce que j'ai choisi)
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
20 janv. 2005 à 20:50
Bon, ben ça commence à avancer :


maintenant j'arrive à gérer les commandes USER, PASS et QUIT





Je n'ai plus qu'à implanter un parser pour les autres commandes et créer les fonctions adéquates.





Ensuite seulement je m'occuperai du transfert de fichiers



Je suis finalement revenu à l'ASCII, étant donné que c'est le format par défaut des sockets.

Mon architecture Multi-Thread marche pas mal, on dirait !
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
25 janv. 2005 à 20:21
Pour l'instant, je gère juste les commandes USER, PASS et QUIT.





Avant de chercher à implanter d'autres commandes, j'aimerais savoir
exactement ce que font les commandes TYPE, MODE et STRU au niveau
serveur (pour une implantation minimum).




De plus, je teste pour l'instant mon serveur avec le programme
console FTP de Windows : existe-t-il d'autres utilitaires consoles et
gratuits pour des dialogues vraiment personnalisés avec un serveur FTP
(pour pouvoir envoyer des commandes de debuguage personnalisées)
0
Rejoignez-nous