Pas de dépendances
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <wininet.h> #pragma comment(lib,"wininet.lib") int main(void) { HINTERNET hInet, hFtp; TCHAR* serveur = _T("ftpperso.free.fr"); TCHAR* utilisateur = _T("fvirtman"); TCHAR* password = _T("xxxxxxxxx"); TCHAR* source = _T("d:/a.txt"); TCHAR* dest = _T("tmp/a.txt"); hInet = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0); if(hInet == NULL) { printf("InternetOpen Invalid Handle value\n"); exit(-1); } hFtp = InternetConnect(hInet, serveur, INTERNET_DEFAULT_FTP_PORT, utilisateur, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); if( hFtp == NULL) { printf("InternetConnect echec : code %d\n",GetLastError()); InternetCloseHandle(hInet); exit(-1); } if (FtpPutFile(hFtp, source, dest, FTP_TRANSFER_TYPE_BINARY, 0)) printf("Fichier ok\n"); else printf("FtpPutFile echec : code %d\n",GetLastError()); InternetCloseHandle(hFtp); InternetCloseHandle(hInet); }
Voici comment se servir des fonctions FTP Windows. Ce programme va mettre un fichier de votre disque dur sur mon propre site... Et oui... Mais ! Si vous lancez le programme, vous allez vous prendre un : internet connect echec code 12014. Et si on regarde la page des codes d'erreur : http://msdn.microsoft.com/en-us/library/windows/desktop/aa385465(v=vs.85).aspx On voit que le code s'appelle ERROR_INTERNET_INCORRECT_PASSWORD Et bien oui, je ne vais pas vous donner mon mot de passe et vous permettre d'envoyer des fichiers sur mon site ! Non mais :) Regardez le programme : On défini plusieurs chaines : - le serveur FTP - le login - le mot de passe (que j'ai soigneusement caché) - le fichier de chez vous à envoyer - ce qu'il devient sur le serveur FTP (il se met dans le repertoire temp, et garde le même nom) Je vais me servir de tout ça pour me connecter. D'abord, la fonction InternetOpen va me préparer Internet. sa doc : http://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx Tout ce que je mets ici, c'est INTERNET_OPEN_TYPE_DIRECT, et des 0 ailleurs. Si vous n'avez de proxy ou autres trucs exotiques, mettez comme moi. Sinon, référez vous à la doc. Ensuite, je me connecte avec InternetConnect. http://msdn.microsoft.com/en-us/library/windows/desktop/aa384363(v=vs.85).aspx Je lui donne : - le handle de la connexion créé avec InternetOpen - le nom du serveur - le port (INTERNET_DEFAULT_FTP_PORT vaut 21 parce que le protocole FTP utilise usuellement le port 21, mais on peut changer) - le login - le password - le service, ici je veux du FTP, donc INTERNET_SERVICE_FTP - et des options. Et pour ma connexion FTP, je vais demander une connexion passive, avec INTERNET_FLAG_PASSIVE Si vous ne touchez pas le programme, c'est la que vous échouez. Si modifiez le programme avec un FTP à vous, ça marchera. Et vous passerez à la fonction suivante : FtpPutFile http://msdn.microsoft.com/en-us/library/windows/desktop/aa384170(v=vs.85).aspx Vous lui donnez - le handle de la connexion créé avec InternetConnect - le fichier sur votre disque - l'endroit ou vous voulez l'envoyer - le type de transfert ASCII ou BINAIRE (binaire marche toujours, remarquez que j'envoie un fichier txt en binaire...) - un lien inutilisé ici vers une variable qui référence une fonction callback optionnelle. Je soupçonne ce paramètre de pouvoir avoir le pourcentage de transmission du fichier (s'il est gros) Regardez bien les codes d'erreur si ça ne marche pas chez vous. A mon avis, on peut avoir : fichier introuvable sur le disque, repertoire introuvable sur le serveur, etc...