View Full Version : [VB/VC++] come fare ftp di file?
MisterW2
30-04-2002, 14:41
Salve, volevo sapere soprattutto in c++ (ma eventualmente come seconda opzione anche con VB) come potrei fare un programma che fa un ftp di file.
Ossia io dispongo di un certo file.xxx e voglio creare un programma che passandogli l'IP del destinatario come parametro, lo invii (ftp, udp.. insomma quello che sapete) ad un utente.
Grazie mille e compl. per il forum!
devi usare funzioni del tipo:
InternetOpen(.....)
InternetConnect(......)
FtpPutFile(.....)
con i relativi parametri di inizializzazione; tutto questo lo trovi ben spiegato sul sito di Microsoft.;)
MisterW2
02-05-2002, 00:04
Grazie della risposta...
stai parlando di VC++ o VB? Se è VC++ sarebbe meglio... sapresti dirmi di preciso il link dove cercarlo nella Microsoft?
misterx : quelle sono per BC++B ;)
Con VC++ & MFC (WinInet) :
CInternetSession (prima crei questa e poi ottieni una delle due sotto)
CFtpConnection
CHttpConnection
Altrimenti se vuoi passare da un livello più basso ci sono CSocket e CAsyncSocket...
Con le API, sia per VC++ che VB...Windows Socket API :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/wsapiref_7v1u.asp
Originariamente inviato da cionci
[B]misterx : quelle sono per BC++B ;)
xchè dici BCB?
io le utilizzo e fanno parte della nutrita serie di funzioni presenti nel Win32sdk di Windows che dovrebbero funzionare in generale con tutti i compilatori;
difatti vengono da qui: http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/wininet/reference/functions/internetopen.asp
Hai ragione...scusa...
Chissà perchè ero convinto che fossero del Borland...
MisterW2
02-05-2002, 11:57
Oddio mi sa che è complicatina... ho cercato anche nei link proposti dal forum... se sapete magari qualche programma svolto per prendere spunto, postatemelo per favore.
Grazie mille.
In liena di massima non dovrebbe essere molto complicato..
Così ad occhio :
CInternetSession s;
CFtpConnection *f = s.GetFtpConnection(tutti i vari parametri);
f->SetCurrentDirectory(dir);
f->PutFile(tutti i vari parametri);
f->Close();
Prova questo codice che dovrebbe essere universale, almeno lo credo al 90%.
Purtroppo non sono un raffinato alla Cionci, quindi pochi commenti;)
ma.....
funziona, l'ho appena provato, ti permette di scaricare un file da 25Kb dal sito ftp di Borland.....
ricordati di inserire:
#include "WININET.h"
e di avere nella fase di link il file (lib): Inet.lib (magari in VC++ non vi è questa necessità)
forza e coraggio, che non è poi così difficile: basta avere un pò di pazienza..:)
fammi sapere
void *FINet;
void *FFtpHandle;
BOOL Transfer;
FINet = InternetOpen("WININET1",0,NULL,0,0);
if(FINet == NULL) {
ShowMessage("Err(1) Connessione non riuscita!\nsicuro che i parametri sono corretti?");
return;}
FFtpHandle = InternetConnect(FINet,
"ftp.borland.com", //sito ftp
0,
0, // nome dell'utente
0, // password
INTERNET_SERVICE_FTP,
0,
0);
if(FFtpHandle == NULL) {
ShowMessage("Err(2) Connessione FTP non riuscita!\nsicuro che i parametri sono corretti?\nOppure è presente un firewall di rete");
return;}
Transfer = FtpGetFile(FFtpHandle,
"/pub/bcppbuilder/techpubs/bcb5/b5cg.zip",
"b5cg.zip",
TRUE,
0,
FTP_TRANSFER_TYPE_BINARY,
0);
if(Transfer == NULL) {
ShowMessage("Err(3) Ricezione file non riuscita!");
return;
}
else
ShowMessage("File ricevuto con successo");
MisterW2
03-05-2002, 09:48
Azz... a me non funziona...
se lo inserisco coem l'hai scritto mi da errore nel file wininet.h:
microsoft visual studio\vc98\include\wininet.h(48) : error C2146: syntax error : missing ';' before identifier 'HINTERNET'
f:\programmi\microsoft visual studio\vc98\include\wininet.h(48) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
inoltre io non devo scaricare un file dal server della borland, ma passarlo ad un altro utente via ftp.
Grazie per l'aiuto
se devi inviare usa:
FtpPutFile()
in luogo di:
FtpGetFile()
esempio:
FFtpHandle = InternetConnect(
FINet,
"ftp.miosito.com", //oppure l'IP (192.xxx.xxx.xxx) che dovrebbe funzionare lo stesso
0,
0, // nome dell'utente
0, // password
INTERNET_SERVICE_FTP,
0,
0);
Transfer = FtpPutFile(FFtpHandle,
"miofile.zip",
"miofile.zip",
FTP_TRANSFER_TYPE_BINARY,
0);
Per quanto riguarda gli errori, molto strano, in quanto il codice postato l'ho scritto in modo lineare, come suggerisce Microsoft.
Prova a vedere se il file da includere è un altro.....
Non avendo VC++ non posso fare delle prove.....
Prova ad include in questo modo :
#include <windows.h>
#include <wininet.h>
MisterW2
03-05-2002, 10:45
Ragà scusate se vi rompo ancora.. alla fine mi odierete... ecco il programma:
#include <windows.h>
#include <wininet.h>
void main()
{
void *FINet;
void *FFtpHandle;
BOOL Transfer;
FINet = InternetOpen("WININET1",0,NULL,0,0);
if(FINet == NULL) {
//ShowMessage("Err(1) Connessione non riuscita!\nsicuro che i parametri sono corretti?");
return;}
FFtpHandle = InternetConnect(
FINet,
"ftp.miosito.com", //oppure l'IP (192.xxx.xxx.xxx) che dovrebbe funzionare lo stesso
0,
0, // nome dell'utente
0, // password
INTERNET_SERVICE_FTP,
0,
0);
if(FFtpHandle == NULL) {
// ShowMessage("Err(2) Connessione FTP non riuscita!\nsicuro che i parametri sono corretti?\nOppure è presente un firewall di rete");
return;}
Transfer = FtpPutFile(FFtpHandle,
"miofile.zip",
"miofile.zip",
FTP_TRANSFER_TYPE_BINARY,
0);
if(Transfer == NULL) {
// ShowMessage("Err(3) Ricezione file non riuscita!");
return;
}
// else
// ShowMessage("File ricevuto con successo");
}
Ho messo // su Showmessage perchè non mi riconosce la funzione, ma al massimo le posso cambiare con printf...
Cmq non mi dà errori di compilazione, ma facendo il build ottengo questa roba strana:
Linking...
prova.obj : error LNK2001: unresolved external symbol __imp__FtpPutFileA@20
prova.obj : error LNK2001: unresolved external symbol __imp__InternetConnectA@32
prova.obj : error LNK2001: unresolved external symbol __imp__InternetOpenA@20
Debug/prova.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.
ç_ç
Project -> Settings -> Link -> Object/Library modules...mettici Inet.lib...
MisterW2
03-05-2002, 11:04
Oddio perchè sono così imbranato..... vi prego perdonatemi...
ho messo inet.lib ma mi dà Linking...
LINK : fatal error LNK1104: cannot open file "Inet.lib"
Error executing link.exe.
Ho aggiunto Inet.lib nella linea Object/library modules
Le altre impostazioni sono:
Category: general
Output file name: Debug/prova.exe
Object library modules: kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Inet.lib
sono spuntati: general debug info;link incrementally
Scusate oggi mi sento ultra rompiball...
MisterW2
03-05-2002, 11:09
ehm.. non so se ho fatto bene, ma ho copiato WININET.LIB in \debug , l'ho aggiunto in prokect/setting e ora pare funzionare, faccio alcune prove e poi vi dico.
Grazie mille!
Un ultima considerazione:
in "ftp.miosito.com", //oppure l'IP (192.xxx.xxx.xxx) che dovrebbe funzionare lo stesso
devo mettere l'ip della macchina che funiona da server del file?
Perchè provando ad autopassarmi il file compare l'errore proprio di quel punto: Err(2) Connessione FTP non riuscita!\nsicuro che i parametri sono corretti?\nOppure è presente un firewall di rete
Bastava mettere Wininet.lib...senza copiarlo nella dir...
Per il resto non so cosa dirti...
Mi sa che hai fatto benissimo ad usare wininet.lib in quanto, essendo passato un pò di tempo, non mi ricordo dove cavolo avevo preso la Inet.lib, forse l'avevo ricompilata x BCB.
Sorry se ti ho depistato;)
Dai che ci siamo:)
MisterW2
03-05-2002, 11:33
Si infatti, vi ringrazio a tutti e due siete stati gentilissimi...
Misterx, un'ultima spiegazione....
"ftp.miosito.com", //oppure l'IP (192.xxx.xxx.xxx)
qyesto dovrebbe essere l'indirizzo del server dico bene? che senso ha metter eun generico ftp.miosito.com? devo mettere l'indirizzo ip del server (quello che inizia con 192.... e non quello del mio pc che inizia con 245....)
Transfer = FtpPutFile(FFtpHandle,
"miofile.zip",
"miofile.zip",
al posto di mio file.zip, in entrambi, devo mettere la giyusta path del file risiedente nel pc del server?
Originariamente inviato da MisterW2
[B]Si infatti, vi ringrazio a tutti e due siete stati gentilissimi...
Misterx, un'ultima spiegazione....
"ftp.miosito.com", //oppure l'IP (192.xxx.xxx.xxx)
qyesto dovrebbe essere l'indirizzo del server dico bene? che senso ha metter eun generico ftp.miosito.com? devo mettere l'indirizzo ip del server (quello che inizia con 192.... e non quello del mio pc che inizia con 245....)
Transfer = FtpPutFile(FFtpHandle,
"miofile.zip",
"miofile.zip",
al posto di mio file.zip, in entrambi, devo mettere la giyusta path del file risiedente nel pc del server?
nel caso vuoi inviare un file presente nel tuo hard-disk al tuo sito, dovrai scrivere semplicemente solo i nomi dei file sorgente/destinazione in quanto il percorso di destinazione vengono risolti automaticamente nel momento in cui tu apri la connessione col nome del sito ftp, username, e tua password.
esempio:
voglio traferire un file JPEG di nome miafoto.jpg sul mio sito presente su digiland, il mio username=pinco, la password=pallino quindo scriverò:
FFtpHandle = InternetConnect(
FINet,
"ftp.digiland.it",
0,
"pinco",
"pallino",
INTERNET_SERVICE_FTP,
0,
0);
if(FFtpHandle == NULL) {
// gestione dei valori di ritorno
return;}
Transfer = FtpPutFile(FFtpHandle,
"miafoto.jpg ",
"miafoto.jpg ",
FTP_TRANSFER_TYPE_BINARY,
0);
Scusa per le banalità ma sono presenti solo per chiarezza.
Spero di essere stato chiaro:)
MisterW2
03-05-2002, 12:19
Sei stato superchiaro, in effetti potrei appoggiarmi ad un sito... ma volevo sapere se è possibile fare un ftp tra due macchine (ossia un peer2peer di file tra due utenti, uno che fa server, l'altro che fa da client).
Grazie ancora
dai un occhio a questo esempio:
http://www.bebits.com/bob/9332/IPTalk.zip
MisterW2
03-05-2002, 14:35
Grazie del link, purtroppo il programma serve solo per una chat peer2peer non per scambio file.
Grazie ugualmente, tenterò di lavorare sullo schema sopra.
Ho provato infatti a scaricare il file dal sito tp della Borland, e funziona effettivamente, quindi il problema si riduce, credo, a far in modo che la mia macchina funga da server per un utente remoto, in modo tale che esso possa scaricare il file da me.
Guarderò come fare, se hai idee...;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.