Tristan SALAÜN ESSI 3ème année
Janvier 2004
Remerciements.
Je remercie Mr. TIGLI pour son soutien aussi bien moral que physique (pour la mise à disposition de la salle 101 principalement) pour la réalisation de ce projet.
Je remercie aussi Mr. MATHIEU pour son support technique et les réponses qu’il a pu m’apporter afin de résoudre quelques problèmes rencontrés lors du projet.
Je remercie aussi tout particulièrement Mr. GUSINU pour son aide et sa réac- tivité qui ont été déterminantes dans l’avancement du projet.
1
Introduction 4 1 Présentation des Technologies utiles pour le projet. 5
1.1 GPRS. . . 5
1.1.1 Détails techniques. . . 5
1.1.2 Structure du réseau. . . 9
1.1.3 Disponibilités. . . 11
1.2 FTP. . . 11
1.2.1 Détails sur le FTP. . . 11
1.2.2 Les commandes FTP. . . 12
1.3 FTPs. . . 13
1.3.1 Détails sur le FTPs. . . 13
1.3.2 Les commandes FTPs. . . 13
2 Le Projet. 15 2.1 Présentation de la jaquette. . . 15
2.2 Configuration de la jaquette. . . 16
2.3 Présentation de la librairie offerte. . . 16
2.4 Critique de la librairie. . . 23
2.4.1 Nom des fonctions. . . 23
2.4.2 Fonctions disponibles dans l’API standard. . . 23
2.4.3 Fonctions à ajouter. . . 25
2.5 Test du fonctionnement de la librairie. . . 25
2.6 Test de la librairie(sniffer). . . 27
2.7 Test de clients/serveurs FTPs sous Windows. . . 27
2.7.1 Serveurs FTPs sous Windows. . . 28
2.7.2 Clients FTPs sous Windows. . . 30
2.8 Description du client FTP sur le PocketPC. . . 34
2.8.1 Fonctionnalités du client. . . 34
2.8.2 RAS. . . 34
2.8.3 API Microsoft. . . 41
2.8.4 Sockets. . . 43
2.8.5 Interface graphique (généralités). . . 44
2.8.6 Client FTP. . . 50
3 Évolutions. 53 3.1 Passage du FTP à FTPs. . . 53
SALAÜN Tristan Janvier 2004
Conclusion 54
4 Diver. 55
4.1 Liste des acronymes . . . 55
Compte rendu Projet 3
L’objectif de de projet est de réaliser un programme sur PocketPC permet- tant de monter et descendre des fichiers vers un serveurFileTransferProtocol (FTP). La connexion réseau sera obtenue grâce à une jaquette comportant une interfaceGeneralPacketRadioService (GPRS) permettant d’être connecté où que l’on ce trouve1. Afin de mener à bien ce projet j’ai effectué des recherches sur les technologies à utiliser (GPRS, FTP, etc), puis je me suis penché sur la réalisation du client FTP sur le PocketPC grâce à l’environnement de dévelop- pement Microsoft eMbedded Visual C++ 3.0.
Vu les difficultés que j’ai rencontré pour trouver de la documentation sur les fonctions que j’ai utilisés, j’ai pris le partit d’inclure dans mon rapport des tutoriels complets sur certaines fonctionnalités (comme l’affichage dynamique d’images, l’utilisation des threads, etc.).
Ce rapport à été rédigé en LATEX2e sous Windows en utilisant l’editeur TeXnic- Center 1 Beta 6.01 (http ://www.toolscenter.org/) et la distribution MiKTeX 2.4.
1Sous condition d’avoir une couverture GSM.
Chapitre 1
Présentation des Technologies utiles pour le projet.
1.1 GPRS.
Afin de pouvoir connecter le PocketPC à internet nous utiliserons une ja- quette comportant une interface GPRS. Voyons un peu plus en détail ce qui ce cache derrière cet acronyme.
1.1.1 Détails techniques.
Les détails techniques présentés ci-dessous s’appuient très largement des in- formations trouvés sur le site [14]
Présentation
Le GPRS ne constitue pas à lui tout seul un réseau mobile à part entière, mais une couche supplémentaire rajoutée à un réseauGlobalSystem forMobile Communication (GSM) existant. Il peut donc être installé sans aucune licence supplémentaire. Ceci signifie que tous les opérateurs qui disposent d’une li- cence GSM peuvent faire évoluer leur réseau vers le GPRS. L’Autorité de Régulation desTélécommunications (ART) n’a d’ailleurs pas fait d’appel d’offre pour le GPRS alors qu’elle en a fait pour l’UniversalMobileTelecommunication System (UMTS).
De plus, le GPRS utilise les bandes de fréquences attribuées au GSM. C’est à dire une bande dans les 900 MHz, une autre dans les 1800 MHz et enfin une troisième pour les USA, dans les 1900 MHz. Les opérateurs GSM actuels ont de fait un quasi monopole sur le GPRS, ce qui n’est pas le cas pour l’UMTS.
Le GPRS, appelé aussi GSM 2+, repose sur la transmission en mode paquet.
Ce principe déjà, retenu par exemple pour le protocole X.25, permet d’affecter à d’autres communications les «temps morts» d’une première communication (attente d’une réponse à une requête Internet par exemple).
5
Conçu pour réutiliser au maximum les infrastructures GSM existantes, le dé- ploiement du GPRS nécessite la mise en place d’une infrastructure réseau basée sur la commutation de paquets et l’introduction de passerelles pour s’adosser aux réseaux GSM existants.
Cette technologie, capable de fournir des débits par utilisateur allant jusqu’à 115 kb/s (contre 9,6 kb/S pour le GSM), offre des fonctionnalités intéressantes :
– plusieurs canaux peuvent être alloués à un utilisateur ; – ces mêmes utilisateurs peuvent partager un même canal ; – le débit est indépendant des liens montant et descendant.
Concrètement, lors du Cedit à Hanovre en 2000, Alcatel a fait une présenta- tion de solutions communicantes sur GPRS ; les débits constatés étaient de 56 kb/s (ce débit dépend des ressources allouées à l’utilisateur, de sa situation par rapport à la cellule, etc.).
Les débits envisagés seraient dans un premier temps de l’ordre de quelques dizaines de kb/s. (Actuellement ils sont de 9600 bps avec orange).
Services / Possibilités / Limitations.
Trois domaines d’application:
Alors que le GSM version WAP s’arrête à la consultation des pages Internet, le GPRS permet d’élargir l’offre de services. Outre l’accès à Internet (ou Intra- net), à partir des mobiles traditionnels, il permet un meilleur accès aux e-mails comportant des fichiers joints. Le mobile, dans ce cas, est considéré comme un modem, et doit être associé à un ordinateur portable ou un assistant personnel.
Le troisième domaine concerne les applications professionnelles de transfert de données et de sécurité. La connexion ouverte en permanence du GPRS et le mode de taxation offrent à ceux qui font de la télémaintenance, de la télésur- veillance et de la télé alarme, des opportunités intéressantes. On trouvera donc la norme GPRS dans les horodateurs, dans les ascenseurs (télésurveillance), dans les distributeurs de boissons ou de billet (vente, télésurveillance, gestion des stocks, réactualisation des prix), pour surveiller les sites industriels ainsi que les locaux professionnels et privés.
Un débit supérieur au réseau filaire standard:
Aujourd’hui, le débit d’un réseau GSM standard en mode «connecté» ne dé- passe pas 9,6 kbit/s, voire 14,4 kbit/s par implantation de logiciels spécifiques.
Il est cinq fois moins rapide que celui du réseau filaire standard, qui autorise 56 kbit/s avec un modem V90.
Avec le GPRS, on dispose d’un débit compris entre 40 et 115 kbit/s. Tout dépend du nombre de canaux virtuels ou «time slots» utilisés, et du schéma de codage (CS1 à CS4). Ce dernier agit sur la compression des données comme un multiplicateur de débit. En mode multislots 3+1 (trois slots pour la trans- mission dans le sens réseau vers portable, et un slot pour le sens portable vers
SALAÜN Tristan Janvier 2004
réseau), on atteint un débit de 40 kbit/s avec un schéma de codage CS2. En multislots (8+1) avec le mode de codage CS4, on atteint en pratique 115 kbit/s (en théorie 175 kbit/s). Si, comme cela semble être la volonté actuelle des opé- rateurs, on réutilise l’infrastructure GSM existante, en conservant notamment le réseau des stations de base (BTS) actuelles, mises à niveau par logiciel, seules les versions CS1 et CS2 seront implantées. Pour les versions CS3 et CS4, des transformations importantes de l’infrastructure devront être réalisés.
Temps moyen pour envoyer un courrier électronique avec un document attaché de 10 pages :
Norme Débit Temps nécessaire
GSM actuel 9,6 kbit/s 7 min.
Modems classiques (V90) 57,6 kbit/s 70 sec.
RNIS 128 kbit/s 31 sec.
GPRS 144 bit/s * 28 sec.
EDGE 384 kbit/s * 10 sec.
2 Mbit/s 2 sec.
Tab.1.1 – Comparaison du débit des différents réseaux.
* : dans les conditions optimales L’accès immédiat et fiable:
Le GPRS offre un accès immédiat. Le mode de fonctionnement du GPRS et son mode de facturation au volume de données transmises, permet de lais- ser le canal de transmission ouvert en permanence. Ainsi, pour télécharger un e-mail par GPRS on économise, par rapport à une connexion par GSM ou RTC, lors de la première connexion, le temps d’initialisation du modem, soit 30 secondes environ. Sur les autres e-mails, l’avantage est encore plus flagrant, les téléchargements se font immédiatement, sans numérotation préalable alors qu’en GSM il faut recommencer la procédure de numérotation pour chaque consultation. Parmi les évolutions possibles du GPRS, figure la voix surInternet Protocol (IP). On peut imaginer le transport de la voix après codage comme une donnée, ce qui ouvre des applications de téléphonie par Internet.
Trois types de terminaux:
Trois types de terminaux ont été définis pour répondre aux besoins du GPRS : le modèle de base (classe B) est prévu pour la voix et les données en mode non simultané. Le modèle professionnel ou industriel (classe C) est data exclusivement (le terminal est utilisé comme un modem). Enfin le haut de gamme (classe A) est compatible voix/data simultanément. Ce terminal classe A pose problème actuellement. La puissance de calcul qu’il demande a pour l’instant une forte incidence sur son coût de production et le rend dissuasif.
Compte rendu Projet 7
Fonctionnement et caractéristiques techniques.
Mode connecté ou accès virtuel:
Le premier avantage du GPRS est de permettre une meilleure utilisation des ressources radio et techniques. Alors que le GSM actuel fonctionne en mode
«connecté», appelé également mode «circuit», le GPRS utilise pour sa part le mode de connexion virtuel. En mode «virtuel», les ressources sont partagées. Le canal de transmission n’est jamais affecté à un utilisateur unique, mais partagé entre un certain nombre d’utilisateurs. Chaque utilisateur en dispose lorsqu’il en a besoin et uniquement dans ce cas. Le reste du temps elles sont disponibles. Le mode «connecté» quant à lui correspond au fonctionnement d’une ligne GSM ou encore d’une ligne téléphonique standard. Il consiste à établir un lien physique entre deux points ou deux correspondants. Une fois le numéro d’appel composé, un circuit est affecté en permanence à la communication, sans aucun partage avec les autres clients. Ce mode de fonctionnement qui ne tient pas compte des périodes de silence, lorsque aucune donnée n’est transmise, n’optimise pas au mieux les ressources radio.
De plus ce mode de fonctionnement entraîne une facturation à la durée. Chaque communication est comptée (et facturée) du décroché, jusqu’au raccroché. Le mode d’allocation dynamique des ressources présente donc également l’avantage de permettre une facturation calculée à partir du volume des informations (pa- quets) échangées et non plus à partir de la durée de la communication. Lors d’une session de consultation sur Internet par exemple, seul le volume des don- nées échangées sert pour l’élaboration de la facture et la durée de la commu- nication n’intervient pas. Ceci revient à dire que l’utilisateur peut consulter les pages reçues sans coût supplémentaire. Précisons que ce mode de tarification, qui s’apparente à celui du réseau Transpac, n’est pas proposé sur le réseau pu- blic commuté.
Le GPRS met en évidence le rôle plus important du gestionnaire de réseau.
Dans une infrastructure GSM le rôle du gestionnaire se résume à affecter des ressources physiques au début de chaque communication. Avec le GPRS, son rôle est plus important. Il consiste à allouer en temps réel des ressources phy- siques (mémoires et circuits électroniques), à gérer les ressources radio, et à les affecter en fonction de la demande.
Le GPRS s’installe sur le réseau GSM existant:
L’implantation du GPRS peut être effectuée sur un réseau GSM existant.
Les stations de base ne subissent aucune modification si ce n’est l’adjonction d’un logiciel spécifique, qui peut être installé par téléchargement. Plus en amont, le contrôleur de stations de base doit être doublé par un contrôleur de paquets (PaquetsControlerUnit (PCU)). Vient ensuite, la chaîne destinée aux données par paquets, constituée du commutateur (SGSN) ou Switch spécifique GPRS, équivalent du Mobile Switch Controler (MSC), contrôleur qui a pour fonction de vérifier l’enregistrement des abonnés, de les authentifier et d’autoriser les com- munications, et du module d’accès (GGSN) au monde IP (Internet ou Intranet).
Le GGSN et le SGSN sont expliqués dans la partie suivante.
SALAÜN Tristan Janvier 2004
Fig.1.1 – Structure d’un réseau GPRS
Ces modifications mineures de l’infrastructure soulèvent deux remarques : La première est que, comme nous l’avons déjà signalé, sans licence GSM (ce qui revient à dire sans réseau GSM), il n’est pas possible d’installer un réseau GPRS.
La deuxième remarque concerne l’UMTS, le réseau de troisième génération qui suivra le GPRS. Il pourra réutiliser une partie du réseau GSM, notamment la partie qui permet l’accès au monde IP. En France, les trois opérateurs GSM nationaux futurs détenteurs d’une licence UMTS, auront donc un avantage im- portant sur le nouvel arrivant, quatrième opérateur UMTS.
1.1.2 Structure du réseau.
Les composantes du réseau GPRS:
Voici l’architecture des piles logicielles dans chacun des éléments d’un réseau GPRS.
Compte rendu Projet 9
Fig.1.2 – Les piles logicielles d’un système GPRS
Dans le terminal mobile, nous trouvons de bas en haut les couches suivantes : – La couche physique, qui se décompose en deux sous-couches fonctionnelles ; – La sous-couche RF, qui gère les fonctions radio du terminal. Elle émet les informations reçues de la couche physique. Elle décode les informations reçues de la station de base et les transfère pour interprétation vers la couche physique ;
– La couche physique produit les trames, qui seront émises par la couche radio ; pour les trames reçues du réseau, elle détecte et corrige les erreurs de transmission ;
– La couche MAC (ou RLC pourRadioLinkControl) pilote la liaison radio entre le terminal et la station de base, c’est-à-dire les mécanismes de re- transmission en cas d’erreur, la fonction de contrôle d’accès aux ressources radio quand plusieurs terminaux sont en concurrence. Le RLC peut de- mander la retransmission d’un bloc de données ;
– La couche supérieure SNDC (SubNetworkDependantConvergence) gère la mobilité, le cryptage et la compression de données.
GGSN : Gateway GPRS Support Node ou Routeur IP s’interfaçant avec les autres réseaux.
Le GGSN est la fonctionnalité d’interconnexion dans le centre de communica- tion (MSC), qui permet de communiquer avec les autres réseaux de données par paquets extérieurs au réseau GSM. Le GGSN masque au réseau de données les spécificités du GPRS. Il gère la taxation des abonnés du service, et doit supporter le protocole utilisé sur le réseau de données avec lequel il est inter- connecté. Les protocoles de données supportés en standard par un GGSN sont IPv6, CLNP et X25.
SGSN : Serving GPRS Support Node ou Routeur IP gérant les terminaux pour une zone. Le SGSN est la fonctionnalité du service dans le centre de com- mutation (MSC), qui permet de gérer les services offerts à l’utilisateur. Le SGSN est l’interface logique entre l’abonné GSM et un réseau de données externe. Ses
SALAÜN Tristan Janvier 2004
missions principales sont, d’une part la gestion des abonnés mobiles actifs (mise à jour permanente des références d’un abonné et des services utilisés) et d’autre part le relais des paquets de données. Quand un paquet de données arrive d’un réseau PDN (PacketDataNetwork) externe au réseau GSM, le GGSN reçoit ce paquet et le transfert au SGSN qui le retransmet vers la station mobile. Pour les paquets sortants, c’est le SGSN qui les transmet vers le GGSN.
Le routage des paquets:
Le routage de chaque paquet est indépendant de celui qui le précède ou de celui qui le suit. Pendant la phase de connexion d’un terminal dans un ré- seau GSM, les échanges de signalisation sont nombreux, et pour faire face aux contraintes du mode paquet, les informations de routage obtenues pour achemi- ner le premier paquet vers un terminal GSM sont stockées dans le GGSN. Ainsi la route pour les paquets suivants est sélectionnée à partir du contexte stocké dans le GGSN (leTemporary Logical LinkIdentity (TLLI)).
1.1.3 Disponibilités.
En France, les opérateurs proposant le GPRS sont les suivant (sont pré- cisé aussi à partir de quelle date les services ont été proposés, d’après le site web [13]) :
– Bouygues Telecom (http ://www.bouygtel.com) - 06/2002 – Orange France - (http ://www.orange.fr) 05/2002
– SFR - (http ://www.sfr.fr) 06/2002
1.2 FTP.
L’objectifs de ce projet est de réaliser un client permettant de transférer des fichiers du PocketPC vers ou à partir d’un serveur FTP.
De nombreusesRequests forComments (RFC) traitent du protocole FTP. L’ac- tuelle RFC est la RFC 959 (voir : [15]), elle fait figure de standard.
1.2.1 Détails sur le FTP.
Voici quelques détails sur ce protocoles (je ne rentrerais pas très en détail, et vous invite à lire la RFC 959 pour tout les détails).
Ce protocole s’appuie sur deux canaux de communications : – un pour les commandes,
– un pour les données.
On peut transférer les données en utilisant plusieurs modes différents de trans- fert :
– ASCII : pour les fichiers textes.
– EBCDIC : pour les fichiers textes encodés grâce au système EBCDIC.
– IMAGE : pour transférer des fichiers divers en binaire.
Compte rendu Projet 11
1.2.2 Les commandes FTP.
Pour le contrôle d’accès :
– USER NAME (USER) : Pour préciser l’utilisateur qui va ce loguer.
– PASSWORD (PASS) : Après avoir précisé le nom de l’utilisateur, on envoie le mot de passe correspondant.
– ACCOUNT (ACCT) : Pour préciser le compte de l’utilisateur.
– CHANGE WORKING DIRECTORY (CWD) : Pour changer de réper- toire courant.
– CHANGE TO PARENT DIRECTORY (CDUP) : Pour remonter d’un niveau de répertoire.
– STRUCTURE MOUNT (SMNT) : Pour monter un système de fichiers.
– REINITIALIZE (REIN) : Pour fermer une session d’un utilisateur mais permettre la fin de la transmission en cours.
– LOGOUT (QUIT) : Fermer une communication avec le serveur FTP.
Pour le transfert de données :
– DATA PORT (PORT) : Permet de préciser le port a utiliser pour le canal de données.
– PASSIVE (PASV) : Permet de passer en mode passif.
– REPRESENTATION TYPE (TYPE) : Pour changer le type de transfert (ASCII, EBCDIC, Image, ...)
– FILE STRUCTURE (STRU) : Pour choisir la structure de fichier.
– TRANSFER MODE (MODE) : Pour choisir le mode de transmission (Stream,Block ouCompressed).
Pour les commandes de service :
– RETRIEVE (RETR) : Permet de demander l’envoie d’une copie du fichier passé en argument.
– STORE (STOR) : Permet d’envoyer un fichier à stocker sur le serveur FTP distant.
– STORE UNIQUE (STOU) : Permet d’envoyer un fichier à stocker sur le serveur FTP distant. Le fichier stocké sur le serveur aura un nom unique dans le répertoire.
– APPEND (with create) (APPE) : IdemSTORE, à la différence que si le fichier destination existe déjà, alors on ajoute les données à la suite du fichier.
– ALLOCATE (ALLO) : Permet d’allouer de la place pour stocker un fi- chier.
– RESTART (REST) : Permet de reprendre un transfert de fichiers.
– RENAME FROM (RNFR) : Spécifie l’ancien nom du fichier à renommer.
Doit être immédiatement suivit par la commandeRNTO.
– RENAME TO (RNTO) : Spécifie le nouveau nom du fichier. Ces deux commandes permettent de renommer un fichier.
– ABORT (ABOR) : Permet d’arrêter une commande en cours.
– DELETE (DELE) : Permet d’effacer un fichier.
– REMOVE DIRECTORY (RMD) : Permet d’effacer un répertoire.
– MAKE DIRECTORY (MKD) : Permet de créer un répertoire.
SALAÜN Tristan Janvier 2004
– PRINT WORKING DIRECTORY (PWD) : Permet d’obtenir le nom du répertoire courant.
– LIST (LIST) : Permet d’obtenir la liste des fichiers du répertoire en pa- ramètre, ou des détails sur le fichier dont le nom a été passé en paramètre.
– NAME LIST (NLST) : IdemLIST, mais ne retourne pas d’informations sur les fichiers, seulement leur nom.
– SITE PARAMETERS (SITE) : Permet d’accéder à des commandes spé- cifiques du serveur FTP.
– SYSTEM (SYST) : Permet d’obtenir des informations sur le système d’exploitation du serveur FTP.
– STATUS (STAT) : Permet d’obtenir le statut du serveur.
– HELP (HELP) : Permet d’obtenir de l’aide sur les commandes dispo- nibles.
– NOOP (NOOP) : Ne fait rien.
Les nouvelles commandes introduites par la RFC 959 par rapport à la RFC 765 sont les suivantes : CDUP, SMNT, STOU, RMD, MKD, PWD et SYST.
Pour plus de détails sur les codes de retour, sur les transferts des données, etc. je vous invite vivement à consulter la RFC 959.
1.3 FTPs.
Dans un soucis de confidentialité des informations transférées, et afin de pou- voir échanger des fichiers de façon sécurisé, un protocole de transfert de fichiers à été établit ; il s’agit du protocole FTPs.
Voici une présentation de cette extension du protocole FTP (Voir section 1.2, page 11). Pour son utilisation sur PocketPC, je vous invite à consulter la sec- tion 3.1, page 53).
1.3.1 Détails sur le FTPs.
Cette RFC datant du mois d’Octobre 1997 définit le standard pour pouvoir transférer des fichiers de façon sécurisée sur le réseau. Les extensions proposés permettent une authentification forte, une intégrité ainsi qu’une confidentialité des communications aussi bien sur le canal de contrôle que sur celui des données.
De nouvelles commandes ont donc été introduites.
Pour de plus amples détails, je vous invite à consulter la RFC correspondante (voir : [16]).
1.3.2 Les commandes FTPs.
Afin d’étendre les fonctionnalités du FTP, les commandes suivantes ont été ajoutés :
– Authentication/Security Mechanism (AUTH) – Authentication/Security Data (ADAT) – Data Channel Protection Level (PROT) – Protection Buffer Size (PBSZ)
– Clear Command Channel (CCC)
Compte rendu Projet 13
– Integrity Protected Command (MIC)
– Confidentiality Protected Command (CONF) – Privacy Protected Command (ENC)
En effet les échanges de fichiers de façon sécurisé sur l’Internet n’étaient pas des plus aisés. Toutefois il existait quelques méthodes comme :
– Proposer sur un serveur FTP des fichiers déjà encryptés.
– Envoyer ces même fichiers par mail.
– Via des connexions RCP sécurisés.
– Via des messages PEM.
C’est pour standardiser les méthodes de transferts de fichiers de façon sécurisé, fiable et surtout pour que ceux-ci soient plus facile d’utilisation qu’a été crée le FTPs. Pour plus de détails sur cette norme, je vous recommande de lire la RFC correspondante (voir : [16]).
Chapitre 2
Le Projet.
Afin de réaliser les connexion FTP via le GPRS, une jaquette a été mise à ma disposition (voir section 2.1, page 15).
Celle-ci était fournie avec un driver et une librairie pour utiliser les commandes FTP. Une première étape de ce projet a été de faire fonctionner la jaquette (je n’ai eu d’ailleurs que tardivement (mi-janvier environ) les informations néces- saires à son fonctionnement) (voir section 2.2, page 16).
Ensuite j’ai testé la librairie FTP fournie (voir section 2.3, page 16 et les sections suivantes).
Je devais tester la librairie fournie en sniffant les trames produites par celle-ci, ce qui m’a amené à tester divers sniffers sous Windows, mais finalement il n’a pas été nécessaire de les utiliser (voir section 2.6, page 27). En effet j’ai été amené à utiliser une classe regroupant les fonctions FTP, donc il devenait inutile de sniffer les trames étant donné que l’on savait ce que l’on produisait.
Ensuite, et dans l’optique de réaliser un client FTPs, j’ai recherché des clients et des serveurs supportant le FTPs (voir section 2.7, page 27). Il ne s’agit pas d’une recherche exhaustive, mais simplement d’une présentation de programmes dont certains ont retenus mon attention.
Enfin après toutes ces recherches, j’ai réalisé un client FTP sur le PocketPC (voir section 2.8, page 34).
Pour cela j’ai aussi du faire de nombreuses recherches afin d’utiliser l’API de Microsoft. J’ai de ce fait produit quelques tutoriels qui aideront les codeurs n’ayant pas de très grandes notions en programmation sous eVC++, souhaitant utiliser des fonctions de communication et produire une interface graphique (voir section 2.8.5, page 44).
Je présenterais enfin le client que j’ai réalisé (voir section 2.8.6, page 50).
Pour finir je présenterais les évolutions de ce projet (voir section 3.1, page 53).
2.1 Présentation de la jaquette.
La jaquette TRIPAQ fournie par la société Clipcard développés par Tricubes (voir figure 2.1, page 16) comporte plusieurs fonctionnalités, parmi celles-ci, on compte le GSM, GPRS mais aussi un lecteur de cartes à puce. Dans notre étude, nous utiliserons seulement le GPRS.
15
Fig.2.1 – Jaquette Tripaq 3800 de Tricubes.
2.2 Configuration de la jaquette.
Afin de pouvoir utiliser la jaquette, il faut configurer quelques paramètres.
Dans un premier temps il faut bien sur installer les drivers fournis avec celle-ci, puis pour tester le bon fonctionnement de celle-ci on peu par exemple configurer une connexion Internet utilisant la connexion GPRS.
Après l’aide providentielle de Mr. GUSINU, qui m’a fournit les paramètres né- cessaires pour faire fonctionner la jaquette (qui sont détaillés ci-dessous), j’ai pu commencer à effectuer des tests sur la librairie fournie ainsi que sur l’API de Microsoft. Nous verrons plus en détails le résultat de ces essais dans les chapitres suivants.
Les étapes à suivre pour configurer la jaquette vont de la page 17 à la page 22.
2.3 Présentation de la librairie offerte.
La librairie fournie pour faire du FTP sur GPRS comporte les fonctions suivantes :
(certaines fonctions sont colorés pour signifier une particularité1) – Ftp_ConnectGPRS: Ce connecter au réseau GPRS.
– Ftp_DisconnectGPRS: Fermer une connexion GPRS.
– Ftp_ConnectToServer: Ce connecter à un serveur FTP.
– Ftp_UserLogin: Ce loguer sur un serveur FTP.
1enorange foncé, les fonctions non documentés, enorange clairles fonctions dont le nom dans la documentation est différent de celui dans le .h
SALAÜN Tristan Janvier 2004
Appuyez sur le menuDémarrer
Sélectionnez Paramètres sur votre POCKET PC
Dans la fenêtreParamètres, appuyez surConnexions
Tab.2.1 – Étape 1 à 3.
Compte rendu Projet 17
Appuyez sur l’icôneConnexions
Sélectionnez Nouveau dans le champ Connexion Internet automatique
Entrez un nom de connexion : gprs orange
Appuyez surModem
Tab.2.2 – Étape 4 à 6.
SALAÜN Tristan Janvier 2004
Appuyez surNouveau
Saisissez un nom de connexion : gprs orange modem
Sélectionnez : Tripaq Tricubes COM
Sélectionnez9600pour le débit Appuyez surAvancés. . .
Saisissez les paramètres ci-contre Appuyez surTCP/IP
Tab.2.3 – Étape 7 à 9.
Compte rendu Projet 19
Vérifiez les paramètres (paramètres par défaut)
Appuyez surServeurs de nom
Vérifiez les paramètres (paramètres par défaut) Appuyez surOK
Puis appuyez surSuivant
Saisissez le numéro de téléphone sui- vant :
*99#
(Il s’agit d’un numéro spécial qui si- gnifie que l’on veux ce connecter en GPRS.)
Appuyez surSuivant
Tab.2.4 – Étape 10 à 12.
SALAÜN Tristan Janvier 2004
Saisissez les paramètres ci-contre (Autres comm. . . . :
+cgdcont=1,"IP","orange-mib") Appuyez surTerminer
Puis appuyez sur Paramètres du proxy
Saisissez les paramètres ci-contre Appuyez surOK
La connexion est configurée et de- vrait apparaître dans la liste dérou- lante, mais il reste encore quelques pa- ramètres à modifier.
Appuyez surEmplacements d’appel
Tab.2.5 – Étape 13 à 15.
Compte rendu Projet 21
Appuyez sur
Modes de numérotation. . .
Saisissez les paramètres ci-contre Appuyez surOK
Ensuite appuyez sur Se connecter
Saisissez les paramètres ci-contre Nom d’util. :mportail
Mot de passe :mib Domaine :orange-mib Appuyez surOk
Vous devriez être connecté maintenant.
Il ne vous reste plus qu’a lancer un In- ternet Explorer par exemple pour véri- fier que tout marche bien.
Tab.2.6 – Étape 16 à 18.
SALAÜN Tristan Janvier 2004
– Ftp_DisconnectFromServer: Fermer une connexion FTP.
– Ftp_GetStatusFromServer: Obtient une réponse du serveur.
– Ftp_GetHELP
– Ftp_GetWorkingDirectory: Obtenir le répertoire courant.
– Ftp_SetWorkingDirectory: Changer de répertoire courant.
– Ftp_ChangeWorkingDirectory
– Ftp_MakeDirectory: Créer un nouveau répertoire.
– Ftp_RemoveDirectory: Effacer un répertoire.
– Ftp_GetFile: Descend (download) un fichier à partir du serveur FTP.
– Ftp_PutFile: Monte (upload) un fichier vers le serveur FTP.
– Ftp_MoveFile: Déplace un fichier dans un autre répertoire.
– Ftp_ChangeFileAttrib: Change les attributs d’un fichier.
– Ftp_ChangeUser: Change l’utilisateur FTP.
– Ftp_SetTransferModeAscii
– Ftp_SetTransferModeImage: Change le mode de communication en mode Binaire.
– Ftp_GetFileList
2.4 Critique de la librairie.
2.4.1 Nom des fonctions.
Dans la documentation, le nom de deux fonctions me semblait étrange. Il s’agissait des fonctionsGPRS_GetWorkingDirectoryetGPRS_PutFile. En effet elles ne correspondent pas à la convention de nommage utilisée par les autres fonctions. En vérifiant dans les sources fournies2on peut s’apercevoir qu’il s’agit effectivement d’une erreur dans la documentation car dans les sources, les fonc- tions ont le bon nom.
La fonctionGPRS_PutFile a exactement la même description que la fonc- tionFtp_GetFile. Il semblerait que la aussi une erreur de copier/coller ce soit glissée.
2.4.2 Fonctions disponibles dans l’API standard.
Windows CE comporte un certain nombre de fonctions permettant de gérer des transferts FTP.
Les descriptions des fonctions ci-dessous ont été extraites de la documentations de l’API de Windows CE [1] et ont été traduites en français. Toutes ces fonctions sont donc disponibles grâce à l’API fournit par Microsoft.
– FtpCreateDirectory : Cette fonction crée un nouveau répertoire sur le serveur FTP.
– FtpDeleteFile: Cette fonction efface un fichier stocké sur le serveur FTP.
– FtpFindFirstFile: Cette fonction permet de lister le contenus d’un ré- pertoire spécifié d’une session FTP. La liste des fichiers et les répertoires est retourné à l’application dans une structure WIN32_FIND_DATA. Afin de continuer l’énumération du contenus du répertoire, il faut utiliser la fonctionInternetFindNextFile.
2Plus précisément dans le fichier.h correspondant à la librairie.
Compte rendu Projet 23
– FtpGetCurrentDirectory: Cette fonction récupère le répertoire courant de la session FTP.
– FtpGetFile: Cette fonction récupère un fichier a partir de la session FTP et l’enregistre sous un nom spécifié, créant ainsi un nouveau fichier local dans le processus.
– FtpOpenFile: Cette fonction initialise un accès à un fichier distant pour une écriture ou une lecture.
– FtpPutFile: Cette fonction écrit un fichier sur le serveur FTP.
– FtpRemoveDirectory : Cette fonction efface le répertoire spécifié sur le serveur FTP.
– FtpRenameFile : Cette fonction renomme un fichier ce trouvant sur le serveur FTP.
– FtpSetCurrentDirectory : Cette fonction change le répertoire courant sur le serveur FTP.
Afin de pouvoir utiliser les fonctions listés ci-dessus, on doit au préalable uti- liser la fonction :InternetOpen, cette fonction initialise un handle qui permettra d’utiliser des fonctions Internet de Windows CE en retournant un HINTERNET.
Nous verrons l’utilisation de l’API de Microsoft plus en détails à partir de la section 2.8.2.
Comme l’on peut le constater facilement, plusieurs fonctions fournies par la librairie fournie reprennent exactement les mêmes fonctionnalités que les fonc- tions présentes dans l’API.
On peut quand même constater que certaines fonctions FTP proposés apportent un plus ou un confort d’utilisation, comme les fonctions suivantes :
– Ftp_MoveFile
– Ftp_ChangeFileAttrib – Ftp_ChangeUser
– Ftp_SetTransferModeImage
Il semblerait que le choix de proposer dans la librairie les fonctions FTP sont dans un but d’assurer sa pérennité. En pratique deux librairies sont proposée (FtpLIB.dll etGPRSLIB.dll) mais un seul fichier de déclaration est fournit.Il aurait été plus judicieux, je le pense de séparer les fonctions GPRS (plus pré- cisément RAS) et FTP. En effet s’il venait indispensable de changer de moyen de communication (passer du GPRS au WiFi par exemple), ou encore de faire évoluer le protocole de communication (passer du FTP au FTPs par exemple) ; il faudrait remplacer complètement la librairie actuelle. C’est pour cela que je ne pense pas que cela soit une bonne idée de regrouper la façon d’accéder au support de communication et le protocole que l’on va utiliser.
De plus des fonctions très utiles ne sont pas présentes dans la documentation, comme la fonction pour effacer, ouvrir ou renommer un fichier. Ces fonctions seraient pourtant très utiles pour la réalisation d’un client FTP.
En cherchant dans le fichier GPRSLIB.H, constate que toutes ces fonctions ne sont pas présentes.
Il s’agit peut être d’un oublis lors des spécifications des fonctionnalités de la librairie.
SALAÜN Tristan Janvier 2004
2.4.3 Fonctions à ajouter.
Il pourrait être intéressant d’avoir à disposition des fonctions supplémen- taires :
– Une fonctions permettant d’obtenir le statut général de la jaquette (afin de savoir si elle est en cours d’initialisation, si elle est prête, si elle est dans un état d’erreur, ....)
– Une fonctions permettant d’obtenir le niveau de réception du signal GSM et du signal GPRS (afin de savoir si le service est disponible dans l’endroit ou l’on ce trouve et qu’il ne s’agit pas d’un dysfonctionnement ni matériel, ni logiciel.)
– Une fonction permettant d’envoyer une commande FTPFTP (par exemple une fonction non standard supportée par un serveur, ou encore une fonc- tion non supportée par la librairie actuelle) et d’en récupérer le résultat provenant soit du canal de commande, soit du canal de données (comme le fait la commande LIST).
– Dans le cas ou l’on travaillerait avec des threads : une fonction permettant de connaître l’état d’avancement d’un transfert par exemple (en montant ou descendant un fichier par exemple).
Plusieurs de ces fonctionnalités pourraient aussi êtres présentes sous forme de voyants sur la jaquette (voyant de niveau de réception ou encore de connexion, de trafic montant ou descendant, . . .comme l’on trouve sur presque tous les modems RTC).
2.5 Test du fonctionnement de la librairie.
Après avoir étudié de près la documentation de la librairie, j’ai donc ensuite testé celle-ci grâce au petit programme de test qui était fournit (Voir fig 2.2, page 26). J’ai changé les messages d’erreurs qui étaient pratiquement tous iden- tiques et assigné des fonctions aux boutons qui en étaient dépourvus afin de pouvoir véritablement tester le plus efficacement possible la librairie. Voici les résultats de ces tests :
– Ftp_UserLogin: La fonction affiche un message sous la forme d’un pop- up, il aurait été plus intéressant de pouvoir récupérer le message afin de pouvoir le traiter comme il le faudrait (affichage dans une fenêtre, enregis- trement dans un fichier pour faire un log, ..., ou même ne pas l’afficher).
– Ftp_GetWorkingDirectory: La fonction affiche un message d’erreur conte- nant le répertoire courant, en plus de le retourner. Je ne comprend pas la présence de ce message, d’autant plus qu’il est sous la forme d’un message d’erreur alors qu’il n’en n’est rien.
– Ftp_DisconnectGPRS: Retourne FALSE, il semble étrange qu’une fonc- tion de ce type échoue.
Il semblerait que les fonctions n’utilisent pas de thread. Il aurait été bien que chaque fonction lancée puisse s’exécuter dans un thread afin de ne pas figer toute l’application si celle-ci a un temps de réponse très long. L’exécution dans un thread permettrait une plus grande stabilité du programme et permettrait en plus de pouvoir éventuellement stopper une commande en cours d’exécution (en cas d’erreur par exemple, ou d’un temps de réponse trop long pour l’utilisateur).
Donc dans ce cas il faudrait une fonction qui permettrait d’arrêter la fonction en
Compte rendu Projet 25
Fig.2.2 – Application de test de Tripaq
cours d’exécution. Toutefois, il est possible de lancer les fonctions de la librairie dans des threads séparés, et pourquoi pas, éventuellement faire une deuxième librairie qui aurait pour but de mettre en place ce système la. Il est aussi possible de refaire une librairie intégrant directement ces fonctionnalités.
Les fonctions Ftp_PutFile, Ftp_GetFile et Ftp_MoveFile retournent un booléen pour dire si l’action c’est bien effectuée ou non. Si l’action ne c’est pas bien effectuée, on n’a aucune information sur la cause. Il aurait été intéressant de savoir si c’est parce que le fichier source est manquant, non lisible, ..., s’il y a un problème sur les droits d’écritures sur la destination, si le fichier de destination existe déjà, ..., si la connexion a été interrompue, ... Bref, il y a une grande variété de problèmes possibles qui ont des causes diverses et des solutions complètement différentes. C’est pourquoi il me semble que dans ce cas, retourner un booléen est trop peu, et qu’il faudrait plutôt retourner un code précisant le déroulement de la fonction.
De plus j’ai remarqué que lors d’une connexion en GPRS, deux fichiers de log (mdmlog0.txtet mdmlog7.txt) sont crées. Il semblerait la encore qu’il s’agisse de «reste» de fonctionnalités de débugage.
Voici le contenus de ces fichiers :
Listing 2.1 – mdmlog0.txt Modem Command : ATZ
2 Modem Re sp ons e : ATZ
4 OK
6 Modem Command : AT Modem Re sp ons e : AT
8
OK
SALAÜN Tristan Janvier 2004
10
Modem Command : ATE0V1&C1&D2
12 Modem Re sp ons e : ATE0V1&C1&D2
14 OK
16 Modem Command : ATS7=120 Modem Re sp ons e :
18 OK
20 Modem Command : AT+c g d c o n t =1 ," IP "," o r a n g e−mib"
Modem Re sp ons e :
22 OK
24 Modem Command : ATX3 Modem Re sp ons e :
26 OK
28 Modem Command : ATDT∗99#
Modem Re sp ons e :
30 CONNECT 9 6 0 0 ßÀ
~ } # ! } ! } ! } } 6 } ! } $Ü}%}" } & } } } }
32 Modem Command : ATH
34 ATZ
On peu constater qu’il s’agit des commandes AT3qui sont envoyés à la jaquette pour ce connecter en GPRS.
Listing 2.2 – mdmlog7.txt Modem Command : CLIENT
2 Modem Re sp ons e : CLIENTSERVER
Je ne sais pas à quoi correspond ce fichier de log.
2.6 Test de la librairie(sniffer).
Afin de tester le bon fonctionnement de la librairie, il avait été envisagé de sniffer les trames envoyés par le PocketPC sur un serveur FTP. Pour cela il fallait mettre en place un serveur FTP ainsi qu’un sniffer afin d’analyser la conformité des trames générées par rapport aux normes. Cela n’a pas été néces- saire car la librairie n’était pas vraiment utilisable.
2.7 Test de clients/serveurs FTPs sous Windows.
Une étape du projet est de mettre en place un serveur FTPs ainsi qu’un client (afin de tester la bonne mise en place du serveur) sous Windows. On pourra aussi éventuellement sniffer le trafic entre le client et le serveur pour
3Les commandes AT permettent la communication de commandes au modem ou au Terminal-Adapter.
Compte rendu Projet 27
constater que les transferts sont biens sécurisés. Pour cela j’ai donc effectué des recherches sur l’Internet afin de trouver des clients et des serveurs FTPs.
2.7.1 Serveurs FTPs sous Windows.
Je commence par les serveurs car sans serveurs, il n’est pas possible de tester un client.
J’ai donc trouvé plusieurs serveurs FTPs :
– orenosv: serveur en ligne de commande, mais marche très bien.
– protr321 : je n’ai pas trouvé comment ajouter un certificat de serveur pour faire du ssl.
– titanftp.exe: très bien, gestion fine des utilisateurs, interface simple et puissante, c’est pour celui-la que j’ai opté.
– WPExplorer.msi Orenosv
Le serveur Orenosv doit ce configurer en éditant des fichiers texte, puis on peu le lancer en ligne de commande. Tout les détails sont expliqués dans le fichier readme.txt. Ce serveur comporte en plus d’un serveur FTPs, une interface de gestion via une page web (ce serveur comporte aussi un serveur HTTP).
Tab.2.7 – Orenosv administration.
Titan FTP Server
Ce serveur est simple d’utilisation grâce à son interface aussi intuitive que puissante. Il permet l’utilisation de communications sécurisés (comme le montre la figure 2.3, page 29) et une gestion fine des utilisateurs (cf. figure 2.4, page 29).
SALAÜN Tristan Janvier 2004
Fig.2.3 – Console d’administration de Titan FTP Server (Gestion de connexions sécurisés)
Fig.2.4 – Console d’administration de Titan FTP Server (Gestion des utilisateurs)
Compte rendu Projet 29
2.7.2 Clients FTPs sous Windows.
Afin de tester le bon fonctionnement des serveurs FTPs mis en place il nous faut un client FTP. De mes recherches il en est ressortit les clients suivants :
– moveitbuddyinst.exe: Fonctionne bien.
– secureftp2_cli_setup.exe : En java et en ligne de commande, mais fonctionne bien.
– SFTPFull.exe: Fonctionne très bien, c’est pour celui-la que j’ai opté.
– WFTPD Explorer.msi: Des problèmes lors de l’utilisation (pour changer de répertoire principalement)
Fig.2.5 – MOVEit Buddy : page de configuration.
SALAÜN Tristan Janvier 2004
Fig.2.6 – MOVEit Buddy : page principale.
Fig.2.7 – Secure FTP v2.0.11.
Compte rendu Projet 31
Fig.2.8 – Page principale de SmartFTP.
SALAÜN Tristan Janvier 2004
Fig.2.9 – WFTPD Explorer : page de configuration.
Fig.2.10 – WFTPD Explorer : page principale.
Compte rendu Projet 33
2.8 Description du client FTP sur le PocketPC.
Lors de ce projet j’ai réalisé un client FTP pour le PocketPC permettant de transférer des fichiers du PocketPC vers un serveur FTP distant.
2.8.1 Fonctionnalités du client.
Le client devra comporter les fonctionnalités suivantes : – Permettre une connexion GPRS (Obligatoire)
– Permettre une connexion par un autre moyen de connexion (Optionnel) – Permettre le transfert de fichiers de et vers le serveur FTP distant (Obli-
gatoire)
– Permettre les actions élémentaires (créer, effacer, renommer un fichier et un répertoire) (Obligatoire)
– Permettre des actions élaborés (comme l’effacement récursif d’un réper- toire, le transfert de plusieurs fichiers, ...) (Optionnel)
– Permettre d’enregistrer plusieurs configurations de serveurs FTP (Option- nel)
– Toutes autre fonctionnalités (Optionnel)
Voyons maintenant plus en détail les fonctions que l’on peu utiliser afin d’effectuer toutes les actions nécessaires. J’ai pris le partit d’être très didactique dans cette partie, car il m’a été assez difficile de trouver toutes les informations sur l’utilisation de toutes les fonctions nécessaires aux communications FTP grâce à l’API de Microsoft. C’est pour cela que les sous-sections suivantes seront sous la forme de tutoriels.
2.8.2 RAS.
Présentation de RAS.
RAS:RemoteAccessService.
RAS est présent dans les couches supérieures du modèle ISO/OSI (Interna- tional Organization for Standardization/Open Systems Interconnection) pour les communications réseau. Dans Windows CE, RAS supporte seulement les protocoles basés sur IP. L’illustration figure 2.11, page 35 présente la relation du RAS avec les autres protocoles de communications dans le modèle OSI.
Quand on crée une application qui nécessite une connexion à un serveur distant, il faut utiliser les fonctions RAS de Windows CE pour manipuler la couche transport du périphérique sélectionné.
Utilisation de RAS.
Afin d’établir une connexion à un serveur sur internet, il y a plusieurs étapes à réaliser. Dans un premier temps on peu lister les connexions disponibles, pour choisir celle que l’on veux utiliser. Ensuite il faut ce connecter au réseau avec les fonctions RAS, puis enfin établir une connexion avec un serveur sur Internet à l’aide d’autres fonctions que nous verrons dans une autre partie.
Afin de faciliter l’utilisation des fonctions RAS, j’ai écrit une classe qui pro- pose les fonctionnalités indispensables à l’utilisation de l’API RAS de Microsoft.
Je l’ai nomméEasyRAS, car elle permet une utilisation facile des fonctions RAS.
SALAÜN Tristan Janvier 2004
Fig.2.11 – RAS dans le modèle OSI
Compte rendu Projet 35
Lister les connexions RAS disponibles.
Dans un premier temps nous pouvons lister les connexions RAS disponibles grâce au code suivant qui va retourner uneCListdeCString. En effet j’ai pris le partis d’utiliser les MFC fournies par Microsoft.
Listing 2.3 – Code pour obtenir les connexion RAS disponibles CList<c l a s s C S t r i n g,c l a s s C S t r i n g & > ∗ EasyRAS : : g e t L i s t ( )
2 {
LPRASENTRYNAME l p r a s e n t r y n a m e ;
4 DWORD nRet ;
DWORD cb ;
6 DWORD c E n t r i e s ; DWORD i ;
8
C S t r i n g s t r M e s s a g e ;
10 C S t r i n g s t r M s g ;
12 r a s L i s t . RemoveAll ( ) ;
14 l p r a s e n t r y n a m e = (LPRASENTRYNAME) L o c a l A l l o c (GPTR,s i z e o f(RASENTRYNAME) ) ; l p r a s e n t r y n a m e−>dwSize = s i z e o f(RASENTRYNAME) ;
16 i f ( ( nRet = RasEnumEntries (NULL, NULL, l p r a s e n t r y n a m e , & cb , & c E n t r i e s ) )
==FALSE)
18 {
l p r a s e n t r y n a m e = (LPRASENTRYNAME) G l o b a l A l l o c (GPTR, cb ) ;
20 l p r a s e n t r y n a m e−>dwSize = s i z e o f(RASENTRYNAME) ; }
22
// C a l l i n g RasEnumEntries t o enumerate t h e phonebook e n t r i e s
24 // Make 2 c a l l s t o t h e f u n c t i o n i n o r d e r t o g e t t h e b u f f e r s s i z e s nRet = RasEnumEntries (NULL, NULL, l p r a s e n t r y n a m e , & cb , & c E n t r i e s ) ;
26
i f ( nRet ! = ERROR_SUCCESS)
28 {
s t r M e s s a g e = " RasEnumEntries f a i l e d : E r r o r %d";
30 s t r M s g . Format ( s t r M e s s a g e , nRet ) ; AfxMessageBox ( s t r M s g ) ;
32 }// end i f ( nRet ! = ERROR_SUCCESS) e l s e
34 {
f o r( i =0; i < c E n t r i e s ; i ++)
36 {
r a s L i s t . AddHead (C S t r i n g( l p r a s e n t r y n a m e−>szEntryName ) ) ;
38 l p r a s e n t r y n a m e ++;
}// end f o r
40 }// end e l s e ( nRet ! = ERROR_SUCCESS)
42 r e t u r n & r a s L i s t ; }
SALAÜN Tristan Janvier 2004
Détails sur une connexion RAS.
Afin d’obtenir plus d’informations sur une connexion (comme le login, le mot de passe, ...), on utilise la fonction suivante qui retourne un RASDetails qui est une structure que j’ai définie pour contenir toutes les informations que je pensais utiles.
Listing 2.4 – Structure RASDetails t y p e d e f s t r u c t t a g R A S D e t a i l s {
2 C S t r i n g lpszName ; C S t r i n g l p s z L o g i n ;
4 C S t r i n g l p s z P a s s ; C S t r i n g lpszDomain ;
6 C S t r i n g lpszPhoneNumber ; C S t r i n g l p s z De v i c e Na m e ;
8 } RASDetails , ∗LPRASDetails ;
Listing 2.5 – Code pour obtenir des informations sur une connexion RAS RASDetails EasyRAS : : g e t D e t a i l s O n (LPTSTR lpszEntryName )
2 {
RASDetails d e t a i l s ;
4
d e t a i l s . lpszName = C S t r i n g( lpszEntryName ) ;
6
// R e c u p e r a t i o n d e s d o n n e e s de l a c o n n e x i o n :
8
BOOL bPasswordSaved ;
10 DWORD dwError , // Return c o d e from t h e f u n c t i o n s
dwRasEntrySize , // S i z e o f t h e RASENTRY s t r u c t u r e
12 d w D e v C o n f i g S i z e ; // S i z e o f DevConfigBuf
BYTE DevConfigBuf [ 1 2 8 ] ; // B u f f e r f o r d e v i c e c o n f i g u r a t i o n d a t a
14
RASENTRY RasEntry ; // RASENTRY s t r u c t u r e
16 RASDIALPARAMS RasDialParams ; // RASDIALPARAMS s t r u c t u r e
18 d w D e v C o n f i g S i z e = s i z e o f ( DevConfigBuf ) ; dwRasEntrySize = s i z e o f (RASENTRY) ;
20 RasEntry . dw Size = s i z e o f (RASENTRY) ;
22 // F i r s t c a l l t h e f u n c t i o n t o g e t t h e good s i z e o f f t h e b u f f e r R a s G e t E n t r y P r o p e r t i e s ( NULL,
24 lpszEntryName ,
&RasEntry ,
26 &dwRasEntrySize ,
DevConfigBuf ,
28 &d w D e v C o n f i g S i z e ) ;
30 // R e t r i e v e t h e e n t r y p r o p e r t i e s .
i f ( dwError = R a s G e t E n t r y P r o p e r t i e s ( NULL,
32 lpszEntryName ,
&RasEntry ,
34 &dwRasEntrySize ,
DevConfigBuf ,
36 &d w D e v C o n f i g S i z e ) )
Compte rendu Projet 37
{
38 i f ( dwError == ERROR_INVALID_SIZE)
AfxMessageBox (TEXT("ERROR_INVALID_SIZE") ) ;
40 i f ( dwError == ERROR_INVALID_PARAMETER )
AfxMessageBox (TEXT("ERROR_INVALID_PARAMETER") ) ;
42 i f ( dwError == ERROR_BUFFER_INVALID )
AfxMessageBox (TEXT("ERROR_BUFFER_INVALID") ) ;
44 i f ( dwError == ERROR_BUFFER_TOO_SMALL )
AfxMessageBox (TEXT("ERROR_BUFFER_TOO_SMALL") ) ;
46 i f ( dwError == ERROR_CANNOT_OPEN_PHONEBOOK )
AfxMessageBox (TEXT("ERROR_CANNOT_OPEN_PHONEBOOK") ) ;
48 i f ( dwError == ERROR_CANNOT_FIND_PHONEBOOK_ENTRY )
AfxMessageBox (TEXT("ERROR_CANNOT_FIND_PHONEBOOK_ENTRY") ) ;
50 }e l s e{
d e t a i l s . l ps z D e v i ce N am e = C S t r i n g( RasEntry . szDeviceName ) ;
52 d e t a i l s . lpszPhoneNumber = C S t r i n g( RasEntry . szLocalPhoneNumber ) ; }// end e l s e R a s G e t E n t r y P r o p e r t i e s
54
// GET OTHERS INFORMATIONS :
56 memset (& RasDialParams , 0 , s i z e o f ( RasDialParams ) ) ; RasDialParams . dw Size = s i z e o f (RASDIALPARAMS) ;
58 _tcscpy ( RasDialParams . szEntryName , lpszEntryName ) ;
60 // R e t r i e v e t h e c o n n e c t i o n d a t a .
i f ( dwError = RasGetEntryDialParams ( NULL,
62 &RasDialParams ,
&bPasswordSaved ) )
64 {
/∗w s p r i n t f ( s z E r r o r ,
66 TEXT( " Unable t o g e t t h e c o n n e c t i o n i n f o r m a t i o n . " ) TEXT( " E r r o r % l d " ) , dwError ) ;
68 AfxMessageBox ( s z E r r o r ) ;∗/
}e l s e{
70 /∗w s p r i n t f ( s z E r r o r ,
TEXT( " I n f o s on RAS: \ r \n
72 entryname : % s \ r \n
username : % s \ r \n
74 passwd : % s \ r \n
domain : % s " ) ,
76 RasDialParams . szEntryName ,
RasDialParams . szUserName ,
78 RasDialParams . szPassword ,
RasDialParams . szDomain ) ;
80 AfxMessageBox ( s z E r r o r ) ;∗/
d e t a i l s . lpszDomain = C S t r i n g( RasDialParams . szDomain ) ;
82 d e t a i l s . l p s z L o g i n = C S t r i n g( RasDialParams . szUserName ) ; d e t a i l s . l p s z P a s s = C S t r i n g( RasDialParams . s z P a s s w o r d ) ;
84 }// end e l s e RasGetEntryDialParams
86 r e t u r n d e t a i l s ; }
SALAÜN Tristan Janvier 2004
Connexion RAS.
Une fois la connexion choisie et les informations récupérés, il nous reste à l’utiliser pour pouvoir effectivement ce connecter au réseau. Pour cela nous uti- lisons la fonctionmakeRASDialdéfinie dans la classeEasyRAS. Notons qu’une va-
riable globale est définie afin d’être utilisée par d’autres fonctions :HRASCONN hRasConn;, il s’agit de la connexion effectuée lors du lancement de la fonctionmakeRASDial.
Listing 2.6 – Fonction makeRASDial BOOL EasyRAS : : makeRASDial ( LPTSTR szRasEntryName ,
2 LPTSTR szUserName ,
LPTSTR szPassword ,
4 LPTSTR szDomain )
{
6 // S e t hRasConn t o NULL b e f o r e a t t e m p t i n g t o c o n n e c t . hRasConn =NULL;
8
// I n i t i a l i z e t h e s t r u c t u r e .
10 memset (& RasDialParams , 0 , s i z e o f (RASDIALPARAMS) ) ;
12 // C o n f i g u r e t h e RASDIALPARAMS s t r u c t u r e . RasDialParams . dw Size = s i z e o f (RASDIALPARAMS) ;
14 RasDialParams . szPhoneNumber [ 0 ] = TEXT(’ \0 ’) ; RasDialParams . szCallbackNumber [ 0 ] = TEXT(’ \0 ’) ;
16 wcscpy ( RasDialParams . szEntryName , szRasEntryName ) ; wcscpy ( RasDialParams . szUserName , szUserName ) ;
18 wcscpy ( RasDialParams . szPassword , s z P a s s w o r d ) ; wcscpy ( RasDialParams . szDomain , szDomain ) ;
20
// Try t o e s t a b l i s h RAS c o n n e c t i o n .
22 i f ( R a s D i a l ( NULL, // E x t e n s i o n n o t s u p p o r t e d NULL, // Phone book i s i n r e g i s t r y
24 &RasDialParams , // RAS c o n f i g u r a t i o n f o r c o n n e c t i o n 0xFFFFFFFF , // N o t i f i e r t y p e i s a window h a n d l e
26 NULL, // Window r e c e i v e s n o t i f i c a t i o n m es s age
&hRasConn ) ! = 0 ) // C o n n e c t i o n h a n d l e
28 {
AfxMessageBox (TEXT(" Could n o t c o n n e c t u s i n g RAS") ) ;
30 r e t u r n FALSE; }
32 r e t u r n TRUE;
}
État de la connexion RAS.
Afin d’obtenir l’état de la connexion au réseau (plus ou moins en pratique, car il ce peut que cette fonction retourneVRAISalors que la connexion n’est pas vraiment établie. Il s’agit d’un problème au niveau de l’API de Microsoft qui considère une connexion établie même si elle échoue lors de l’ouverture.
Listing 2.7 – État d’une connexion RAS BOOL EasyRAS : : g e t C o n n e x i o n S t a t u s ( )
2 {
Compte rendu Projet 39
RASCONNSTATUS r a s c o n n s t a t u s ;
4 r a s c o n n s t a t u s . dwSize = s i z e o f (RASCONNSTATUS) ;
6 r e t u r n R a s G e t C o n n e c t S t a t u s ( hRasConn , & r a s c o n n s t a t u s ) = = 0 ; }
Déconnexion RAS.
Pour ce déconnecter du réseau (en général après avoir fermé la connexion au serveur auquel on était connecté) on peu utiliser la fonction suivante. Le fonctionnement est le suivant :
– On liste les connexions ouvertes.
– On parcourt celles-ci.
– Si elle porte le nom de la connexion que l’on a ouverte alors on la ferme.
– Sinon on la laisse ouverte car il s’agit sûrement d’une connexion par un autre moyen (comme par exemple une connexion Wifi ou encore ActiveSync)
Listing 2.8 – Fermeture d’une connexion RAS
BOOL EasyRAS : : closeRASConnexion (C S t r i n g s z C o n n e x i o n T o C l o s e )
2 {
i n t i n d e x ; // An i n t e g e r i n d e x
4 TCHAR s z E r r o r [ 1 0 0 ] ; // B u f f e r f o r e r r o r c o d e s DWORD dwError , // E r r o r c o d e from a f u n c t i o n c a l l
6 dwRasConnSize , // S i z e o f RasConn i n b y t e s dwNumConnections ; // Number o f c o n n e c t i o n s f o u n d
8 RASCONN RasConn [ 2 0 ] ; // B u f f e r f o r c o n n e c t i o n s t a t e d a t a // Assume t h e maximum number o f e n t r i e s i s 2 0 .
10
C S t r i n g s t r M s g ;
12
// Assume no more than 2 0 c o n n e c t i o n s .
14 RasConn [ 0 ] . dwSize = s i z e o f (RASCONN) ; dwRasConnSize = 2 0 ∗ s i z e o f (RASCONN) ;
16
// Find a l l c o n n e c t i o n s .
18 i f ( dwError = RasEnumConnections ( RasConn ,
&dwRasConnSize ,
20 &dwNumConnections ) )
{
22 i f ( debug ) w s p r i n t f ( s z E r r o r , TEXT(" RasEnumConnections E r r o r : % l d ") , dwError ) ; i f ( debug ) AfxMessageBox ( s z E r r o r ) ;
24 r e t u r n f a l s e ; }// end i f
26
// I f t h e r e a r e no c o n n e c t i o n s , r e t u r n z e r o .
28 i f ( ! dwNumConnections ) {
30 i f ( debug ) w s p r i n t f ( s z E r r o r , TEXT("No open RAS c o n n e c t i o n s ") ) ; i f ( debug ) AfxMessageBox ( s z E r r o r ) ;
32 r e t u r n t r u e ; }
34
SALAÜN Tristan Janvier 2004
// Terminate a l l o f t h e remote a c c e s s c o n n e c t i o n s .
36 f o r ( i n d e x = 0 ; i n d e x < ( i n t ) dwNumConnections ; ++ i n d e x ) {
38 C S t r i n g compare ;
compare . Format ( L"%s ", RasConn [ i n d e x ] . szEntryName ) ;
40 i f ( ! s z C o n n e x i o n T o C l o s e . Compare ( compare ) ) {
42 i f ( dwError = RasHangUp ( RasConn [ i n d e x ] . h r a s c o n n ) ) {
44 i f ( debug ) w s p r i n t f ( s z E r r o r , TEXT("RasHangUp E r r o r : % l d ") , dwError ) ; i f ( debug ) AfxMessageBox ( s z E r r o r ) ;
46 r e t u r n f a l s e ; }e l s e{
48 i f ( debug ) s t r M s g . Format ( L" Ferme : % s ", RasConn [ i n d e x ] . szEntryName ) ; i f ( debug ) AfxMessageBox ( s t r M s g ) ;
50 }// end e l s e
}// end i f
52 }// end f o r r e t u r n t r u e ;
54 }
2.8.3 API Microsoft.
Connexion Internet/FTP.
Une fois que nous nous sommes connectés au réseau, il nous reste a nous connecter sur un serveur situé sur le réseau. Il faut pour cela ouvrir une com- munication internet, puis ensuite utiliser ce HANDLE afin de ce connecter à un serveur (serveur FTP dans notre cas).
Listing 2.9 – Code pour ce connecter à un serveur FTP LPCTSTR l p s z A g e n t = TEXT("TRS_TEST_AGENT") ;
2 DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG;
LPCTSTR l p s z P r o x y = NULL;
4 LPCTSTR l p s z P r o x y B y p a s s = NULL;
DWORD dwFlags = NULL;
6
h I n t e r n e t = I n t e r n e t O p e n ( l p s z A g e n t ,
8 dwAccessType ,
l p s z P r o x y ,
10 l p s z P r o x y B y p a s s ,
dwFlags ) ;
12
i f ( h I n t e r n e t ==NULL) {
14 AfxMessageBox (TEXT(" E r r e u r l o r s de l a c o n n e x i o n ") ) ; a f f i c h (C S t r i n g( (LPCTSTR)IDS_CONNECT_INTERNET_FAIL ) ) ;
16 }e l s e{
a f f i c h (C S t r i n g( (LPCTSTR)IDS_CONNECT_INTERNET_SUCCES ) ) ;
18 }
20
a f f i c h (C S t r i n g( (LPCTSTR)IDS_CONNECT_FTP_START ) ) ;
22
Compte rendu Projet 41
24 LPCTSTR lpszServerNameFTP = TEXT(" f t p . l i p 6 . f r ") ;
INTERNET_PORT nServerPortFTP = INTERNET_DEFAULT_FTP_PORT;
26 LPCTSTR lpszUserNameFTP = NULL; // TEXT( " anonymous " ) ; LPCTSTR lpszPasswordFTP = NULL; // TEXT( " m o i @ l u i . com " ) ;
28 DWORD dwServiceFTP = INTERNET_SERVICE_FTP ; DWORD dwFlagsFTP = INTERNET_FLAG_PASSIVE ;
30 DWORD dwContextFTP = NULL;
32
hInternetFTP = I n t e r n e t C o n n e c t ( h I n t e r n e t ,
34 lpszServerNameFTP ,
nServerPortFTP ,
36 lpszUserNameFTP ,
lpszPasswordFTP ,
38 dwServiceFTP ,
dwFlagsFTP ,
40 dwContextFTP ) ;
42 i f ( hInternetFTP ==NULL) {
AfxMessageBox (TEXT(" E r r e u r l o r s de l a c o n n e x i o n FTP") ) ;
44 a f f i c h (C S t r i n g( (LPCTSTR)IDS_CONNECT_FTP_FAIL ) ) ; }e l s e{
46 a f f i c h (C S t r i n g( (LPCTSTR)IDS_CONNECT_FTP_SUCCES ) ) ; }// end e l s e
Déconnexion Internet/FTP.
Une fois que les communications sont finies, il faut ce déconnecter du serveur FTP et libérer leHANDLEInternet de la façon suivante :
Listing 2.10 – Code pour ce déconnecter d’un serveur FTP BOOL r e t ;
2
a f f i c h (TEXT(" Fermeture de l a c o n n e x i o n FTP . . . ") ) ;
4 r e t = I n t e r n e t C l o s e H a n d l e ( hInternetFTP ) ; i f ( r e t ) {
6 a f f i c h (TEXT(" Connexion FTP éf e r m e ") ) ; }e l s e{
8 a f f i c h (TEXT("Éc h e c l o r s de l a f e r m e t u r e de l a c o n n e x i o n FTP") ) ; }
10
a f f i c h (TEXT(" Fermeture de l a c o n n e x i o n I n t e r n e t . . . ") ) ;
12 r e t = I n t e r n e t C l o s e H a n d l e ( h I n t e r n e t ) ; i f ( r e t ) {
14 a f f i c h (TEXT(" Connexion I n t e r n e t éf e r m e ") ) ; }e l s e{
16 a f f i c h (TEXT("Éc h e c l o r s de l a f e r m e t u r e de l a c o n n e x i o n I n t e r n e t ") ) ; }
Après avoir tenté d’utiliser l’API de Microsoft en utilisant un serveur FTP qui acceptait des connexions anonymes, j’ai tenté de me connecter sur un autre serveur en utilisant un login et un mot de passe. Et dans ce cas il m’a été
SALAÜN Tristan Janvier 2004
impossible de me connecter. En poussant mes recherches sur l’Internet, j’ai découvert qu’en fait il était impossible de ce loguer autrement que de façon anonyme car Microsoft n’avait pas implémenté les fonctions pour le faire. Il ne restait qu’une solution : utiliser une API de plus bas niveau (en fait pratiquement le plus bas possible dans notre cas) à savoir les sockets. En effet à ce niveau il ne s’agit que de transfert de données via un canal de communication. A notre charge d’implémenter le protocole à utiliser.
C’est pour cela que j’ai utilisé les sockets afin d’utiliser le FTP sur le PocketPC.
2.8.4 Sockets.
Présentation de la classe.
Les fonctions FTP sont regroupés sous la forme d’un classe. Cette présenta- tion permet de pouvoir séparer le code d’assez bas niveau au code plus haut au niveau de l’interface graphique et aussi de pouvoir réutiliser le code beaucoup plus facilement.
Je ne vais pas décrire complètement le code de cette classe, mais simplement présenter les fonctions disponibles.
– BOOL ConnectToServer( CString csServer, UINT unPort ): Permet de ce connecter à un serveur FTP en passant son nom et le numéro de port à utiliser.
– BOOL UserLogin(CString csUserName, CString csPassword ) : Per- met de s’authentifier à l’aide d’un login et d’un mot de passe.
– BOOL DisconnectFromServer(): Permet de ce déconnecter.
– CString GetStatusFromServer(): Permet d’obtenir l’état du serveur.
– CString GetHELP(): Permet d’obtenir de l’aide.
– CString GetWorkingDirectory( ) : Permet d’obtenir le répertoire dis- tant courant.
– BOOL SetWorkingDirectory( CString csDirectory ): Permet de chan- ger de répertoire.
– BOOL ChangeWorkingDirectory( CString csDirectory ): Alias deSetWorkingDirectory; – BOOL MakeDirectory( CString csDirectory ): Permet de créer un ré-
pertoire.
– BOOL RemoveDirectory( CString csDirectory ): Permet d’effacer un repertoire.
– BOOL GetFile( CString csRemoteFile, CString csLocalFile ): Per- met de récupérer un fichier distant.
– BOOL PutFile( CString csLocalFile, CString csRemoteFile ): Per- met d’envoyer un fichier local sur le serveur FTP.
– BOOL MoveFile( CString csSourcePath, CString csDestPath ): Per- met de déplacer un fichier distant.
– BOOL ChangeFileAttrib( CString csFilePath, CString csAttrib ): Permet de changer les droits d’un fichier distant.
– BOOL ChangeUser( CString csUserName, CString csPassword ): Per- met de changer d’utilisateur.
– BOOL SetTransferModeAscii( ): Permet de changer le mode de trans- fert de fichier en ASCII (mode utilisé pour le texte).
– BOOL SetTransferModeImage( ): Permet de changer le mode de trans- fert de fichier en Image (mode utilisé pour les fichiers binaires).
Compte rendu Projet 43