PDA

View Full Version : Delucidazionu sul Visual Basic


GogetaSSJ
05-10-2003, 09:03
Salve a tutti, avrei la necessità di far fare una connessione ad un server ftp ad una mia applicazione scritta in VB.

Sono totalmente ignorante sotto questo aspetto della programmazione. Dove posso trovare una buona guida che mi spieghi passo passo come aprire una connessione, ricavare un indirizzo ip, trasferire un file e cose di questo tipo?

Grazie a tutti quelli che mi risponderanno ;)

bsummer
05-10-2003, 09:06
Se hai la msdn installata, dai un occhiata al controllo winsock...Prova a vedere se fa al caso tuo.

Aloha!

cionci
05-10-2003, 09:19
Originariamente inviato da GogetaSSJ
Sono totalmente ignorante sotto questo aspetto della programmazione. Dove posso trovare una buona guida che mi spieghi passo passo come aprire una connessione, ricavare un indirizzo ip, trasferire un file e cose di questo tipo?

Se vuoi imparare veramente qualcosa: http://www.ietf.org/rfc/rfc0959.txt?number=0959

Luc@s
05-10-2003, 09:36
tnk cionci era da un po che lo cercavo:D

GogetaSSJ
05-10-2003, 10:14
Ok grazie ragazzi.... ora vedo un pò quello che mi avete consigliato. Se ho problemi non esiterò a tornare qui ;)

GogetaSSJ
05-10-2003, 10:59
Ecco ho il primo problema.... ho capito grosso modo come funziona il Winsock.

Ora tramite dei command button riesco a connettermi e disconnettermi da un ftp. Come posso impartire i comandi tipo stor, mkd ecc...?

In pratica dovrei mandare un file nell'ftp.... credo sia semplice da fare ma non so da dove partire.

cionci
05-10-2003, 11:07
Con SendData invii i comandi FTP...

GogetaSSJ
05-10-2003, 12:15
Io ho provato ad usare questo comando:

Winsock1.SendData (List)

Per listare il contenuto del ftp (ovviamente dopo essermi connesso regolarmente), ma mi restituisce questo errore:



Cosa può essere?

bsummer
05-10-2003, 12:21
Quella frase il cui senso è abbastanza difficile (secondo me) da capire, non sta a significare altro che la connessione verso il server non è stabilita.

Puoi fare un controllo tramite la proprietà "state" del winsock : se il valore è diverso da "7" la connessione non è stabilita.

Aloha!

bsummer
05-10-2003, 12:22
alchè mi viene un dubbio...quando fai la connessione hai esplicitamente detto al controllo winsock su quale porta effettuarla?

Aloha!

GogetaSSJ
05-10-2003, 12:30
Sì sì, in pratica faccio la connessione verso il mio sito ftp (tramite un indirizzo No-ip) e vedo che il client è connesso.

bsummer
05-10-2003, 12:39
mmm, ma sta benedetta proprietà .state puoi dirmi che valore ha prima che tu faccia il .send?

Aloha!

GogetaSSJ
05-10-2003, 13:05
Risulta il valore 7, ovvero connesso correttamente da quanto ho capito.

bsummer
05-10-2003, 13:21
Allora temo che la cosa non si possa fare :(

Naturalmente se qualcuno mi smentisce è meglio...

Il winsock permette l'utilizzo di 2 protocolli: il tcp/ip e l'udp.

Il Tcp/ip è ben noto, mentre l'udp è il protoccolo usato per le connessioni di tipo peer2peer.

L'ftp utilizza come dice il nome stesso un'altro tipo di protocollo.

Io credo che la fase di connessione non abbia problemi, ma quando vie è lo scambio di dati con il metodo .send, il winsock invia i pacchetti in formato tcp/ip mentre il server si aspetta un pacchetto di tipo ftp...

Quindi il problema sta appunto nel tipo di protocollo usato, che è in questo caso errato...

Conferme/smentite?

Aloha!

bsummer
05-10-2003, 13:26
...forse ho trovato la soluzione ai tuoi problemi....

Invece del controllo winsock, guarda la guida a proposito del
"Controllo Microsoft Internet Transfer (trasferimento Internet)"

Aloha!

GogetaSSJ
05-10-2003, 15:51
Sì sì ci sono riuscito con Inet!! Grazie!!!
Un'altra cosuccia... come faccio a controllare se la connessione è attiva con winsock?

In pratica deve fare questo:
se la connessione è attiva, si connette ad un ftp e manda un file, in caso contrario non fa nulla

Delucidazioni? Fino ad ora mi siete stati molto d'aiuto ;)

cionci
05-10-2003, 16:02
Originariamente inviato da bsummer
Conferme/smentite?

Il TCP/IP è tutto lo stack di protocolli...forse intendi il TCP e basta...

Il protocollo FTP è incapsulato nel TCP...quindi deve funzionare...

bsummer
05-10-2003, 17:48
Originariamente inviato da GogetaSSJ
Un'altra cosuccia... come faccio a controllare se la connessione è attiva con winsock?


In che senso se la connessione è attiva? Intendi se il pc è connesso alla rete?

Aloha!

bsummer
05-10-2003, 17:52
Originariamente inviato da cionci
Il protocollo FTP è incapsulato nel TCP...quindi deve funzionare...

Già...ma non gli funzionava...
Il winsock non è difficile da usare e stando a quanto ha riferito la conessione è stabilita ma si verifica un errore nel momento in cui c'è la trasmissione dati...

Senza contare che se effettivamente il winsock gestisce sia tcp che udp che ftp, non mi spiego il motivo per cui microzoft ha inserito un controllo a parte che gestisce l' http e l'ftp...

Aloha!

GogetaSSJ
05-10-2003, 18:43
Originariamente inviato da bsummer
In che senso se la connessione è attiva? Intendi se il pc è connesso alla rete?

Aloha!

Esatto. Escludendo però eventuali connessioni LAN. Quindi intendo proprio connessioni ad internet presso un provider.

GogetaSSJ
05-10-2003, 19:32
Comunque ho fatto una ricerca + approfondita ed ho trovato una sezione dedicata alle applicazioni FTP tramite VB.
Non bisogna usare il comando SendData, bensì la funzione .execute del winsock.

Ma alla fine è molto simile all'inet.

bsummer
05-10-2003, 20:06
La mia msdn non parla di un metodo .execute per quanto riguarda il winsock... dove l'hai letto? :confused:

Per quanto riguarda lo stato della connessione remota: ho spulciato l' msdn ma non ho trovato nulla che possa fare al tuo caso... Non saprei cosa suggerirti, mi spiace :(

Aloha!

GogetaSSJ
05-10-2003, 20:19
Metti questo come chiave di ricerca e troverai la pagina

connessioni, operazioni FTP

Per il discorso del winsock... nessuno sa aiutarmi?? :(

bsummer
05-10-2003, 20:28
Ok, questo l'avevo già trovato...quello che mi suona strano è che hai scritto che si deve usare il metodo .execute del winsock quando il winsock non ha questo metodo!

L'exeute è un metodo di inet...

Aloha!

GogetaSSJ
05-10-2003, 22:34
Si scusami, ho fatto una confusione incredibile, sorry :(:muro:

Comunque sembra proprio che con il send data del winsock non si possa interagire con un server ne http ne ftp, ma è fattibile solo con l'inet.

Attendo risposte al mio problema.
Grazie ancora

VICIUS
05-10-2003, 22:49
spulciando un po newi miei vecchi appunti ho trovato questo. spero ti possa essere di aiuto.

API da usare:
Public Declare Function InternetGetConnectedStateEx Lib "wininet.dll" _
Alias "InternetGetConnectedStateExA" _
(ByRef lpdwFlags As Long, _
ByVal lpszConnectionName As String, _
ByVal dwNameLen As Long, _
ByVal dwReserved As Long _
) As Long

Public Enum EIGCInternetConnectionState
INTERNET_CONNECTION_MODEM = &H1&
INTERNET_CONNECTION_LAN = &H2&
INTERNET_CONNECTION_PROXY = &H4&
INTERNET_RAS_INSTALLED = &H10&
INTERNET_CONNECTION_OFFLINE = &H20&
INTERNET_CONNECTION_CONFIGURED = &H40&
End Enum

Public Property Get InternetConnected( _
Optional ByRef eConnectionInfo As EIGCInternetConnectionState, _
Optional ByRef sConnectionName As String _
) As Boolean
Dim dwFlags As Long
Dim sNameBuf As String
Dim lR As Long
Dim iPos As Long
sNameBuf = String$(513, 0)
lR = InternetGetConnectedStateEx(dwFlags, sNameBuf, 512, 0&)
eConnectionInfo = dwFlags
iPos = InStr(sNameBuf, vbNullChar)
If iPos > 0 Then
sConnectionName = Left$(sNameBuf, iPos - 1)
ElseIf Not sNameBuf = String$(513, 0) Then
sConnectionName = sNameBuf
End If
InternetConnected = (lR = 1)
End Property

come si usa:
Private Sub Command1_Click()
Dim eR As EIGCInternetConnectionState
Dim sMsg As String
Dim sName As String
Dim bConnected As Boolean

' Determine whether we have a connection:
bConnected = InternetConnected(eR, sName)

' The connection state info parameter provides details
' about how we connect:
If (eR And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then
sMsg = sMsg & "Connection uses a modem." & vbCrLf
End If
If (eR And INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN Then
sMsg = sMsg & "Connection uses LAN." & vbCrLf
End If
If (eR And INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY Then
sMsg = sMsg & "Connection is via Proxy." & vbCrLf
End If
If (eR And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then
sMsg = sMsg & "Connection is Off-line." & vbCrLf
End If
If (eR And INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED Then
sMsg = sMsg & "Connection is Configured." & vbCrLf
Else
sMsg = sMsg & "Connection is Not Configured." & vbCrLf
End If
If (eR And INTERNET_RAS_INSTALLED) = INTERNET_RAS_INSTALLED Then
sMsg = sMsg & "System has RAS installed." & vbCrLf
End If

' Display the connection name and info:
If bConnected Then
Text1.Text = "Connected: " & sName & vbCrLf & vbCrLf & sMsg
Else
Text1.Text = "Not Connected: " & sName & vbCrLf & vbCrLf & sMsg
End If

End Sub

fa un po piu di quello che ti serve ma se ci guardi nella prima riga dice proprio se si è connessi ad internet.

ciao ;)

GogetaSSJ
06-10-2003, 14:04
Scusa l'ignoranza ma sono un novellino. Come faccio ad utilizzare correttamente l'API? (ora la sparo pure grossa... che cos'è un API?)

Se incollo le 2 porzioni di codice in un progetto mi dice che non posso utilizzare matrici ecc... in una dichiarazione pubblica (riferendosi alla prima porzione di codice da te menzionato)

Grazie ancora per la disponibilità e la pazienza

supertonno
06-10-2003, 14:07
State facendo un po di confusione. Il protocollo TCP/IP è un protocollo di livello trasporto,cioe gestisce il routing del pacchetto,mentre il protocollo FTP e al livello applicazione. L'FTP non sa se è trasferito in modo TCP o UDP. In VB se usi il comando WSOCK devi esegure i comandi del protocollo FTP. Io ti sconsiglio di farlo in VB perche il controllo WSOCK e abbastanza scadente. Consiglierei C o java. Cmq la soluzione giusta per te e cercare un componente che gestisca il colloquio.

cionci
06-10-2003, 17:55
Vai...così sei a posto :)

Const FTP_TRANSFER_TYPE_UNKNOWN = &H0
Const FTP_TRANSFER_TYPE_ASCII = &H1
Const FTP_TRANSFER_TYPE_BINARY = &H2
Const INTERNET_DEFAULT_FTP_PORT = 21 ' default for FTP servers
Const INTERNET_SERVICE_FTP = 1
Const INTERNET_FLAG_PASSIVE = &H8000000 ' used for FTP connections
Const INTERNET_OPEN_TYPE_PRECONFIG = 0 ' use registry configuration
Const INTERNET_OPEN_TYPE_DIRECT = 1 ' direct to net
Const INTERNET_OPEN_TYPE_PROXY = 3 ' via named proxy
Const INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4 ' prevent using java/script/INS
Const MAX_PATH = 260
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Declare Function InternetCloseHandle Lib "wininet" (ByRef hInet As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
Private Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszCurrentDirectory As String, lpdwCurrentDirectory As Long) As Long
Private Declare Function FtpCreateDirectory Lib "wininet.dll" Alias "FtpCreateDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
Private Declare Function FtpRemoveDirectory Lib "wininet.dll" Alias "FtpRemoveDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
Private Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean
Private Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" (ByVal hFtpSession As Long, ByVal lpszExisting As String, ByVal lpszNew As String) As Boolean
Private Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hConnect As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Long, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByRef dwContext As Long) As Boolean
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hConnect As Long, ByVal lpszLocalFile As String, ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
Private Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Boolean
Private Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long
Private Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long
Const PassiveConnection As Boolean = True
Private Sub Form_Load()
'KPD-Team 2000
'URL: http://www.allapi.net
'E-Mail: KPDTeam@allapi.net
Dim hConnection As Long, hOpen As Long, sOrgPath As String
'open an internet connection
hOpen = InternetOpen("API-Guide sample program", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
'connect to the FTP server
hConnection = InternetConnect(hOpen, "your ftp server", INTERNET_DEFAULT_FTP_PORT, "your login", "your password", INTERNET_SERVICE_FTP, IIf(PassiveConnection, INTERNET_FLAG_PASSIVE, 0), 0)
'create a buffer to store the original directory
sOrgPath = String(MAX_PATH, 0)
'get the directory
FtpGetCurrentDirectory hConnection, sOrgPath, Len(sOrgPath)
'create a new directory 'testing'
FtpCreateDirectory hConnection, "testing"
'set the current directory to 'root/testing'
FtpSetCurrentDirectory hConnection, "testing"
'upload the file 'test.htm'
FtpPutFile hConnection, "C:\test.htm", "test.htm", FTP_TRANSFER_TYPE_UNKNOWN, 0
'rename 'test.htm' to 'apiguide.htm'
FtpRenameFile hConnection, "test.htm", "apiguide.htm"
'enumerate the file list from the current directory ('root/testing')
EnumFiles hConnection
'retrieve the file from the FTP server
FtpGetFile hConnection, "apiguide.htm", "c:\apiguide.htm", False, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0
'delete the file from the FTP server
FtpDeleteFile hConnection, "apiguide.htm"
'set the current directory back to the root
FtpSetCurrentDirectory hConnection, sOrgPath
'remove the direcrtory 'testing'
FtpRemoveDirectory hConnection, "testing"
'close the FTP connection
InternetCloseHandle hConnection
'close the internet connection
InternetCloseHandle hOpen
End Sub
Public Sub EnumFiles(hConnection As Long)
Dim pData As WIN32_FIND_DATA, hFind As Long, lRet As Long
'set the graphics mode to persistent
Me.AutoRedraw = True
'create a buffer
pData.cFileName = String(MAX_PATH, 0)
'find the first file
hFind = FtpFindFirstFile(hConnection, "*.*", pData, 0, 0)
'if there's no file, then exit sub
If hFind = 0 Then Exit Sub
'show the filename
Me.Print Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
Do
'create a buffer
pData.cFileName = String(MAX_PATH, 0)
'find the next file
lRet = InternetFindNextFile(hFind, pData)
'if there's no next file, exit do
If lRet = 0 Then Exit Do
'show the filename
Me.Print Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
Loop
'close the search handle
InternetCloseHandle hFind
End Sub
Sub ShowError()
Dim lErr As Long, sErr As String, lenBuf As Long
'get the required buffer size
InternetGetLastResponseInfo lErr, sErr, lenBuf
'create a buffer
sErr = String(lenBuf, 0)
'retrieve the last respons info
InternetGetLastResponseInfo lErr, sErr, lenBuf
'show the last response info
MsgBox "Error " + CStr(lErr) + ": " + sErr, vbOKOnly + vbCritical
End Sub

cionci
06-10-2003, 17:57
Originariamente inviato da supertonno
State facendo un po di confusione. Il protocollo TCP/IP è un protocollo di livello trasporto,cioe gestisce il routing del pacchetto,mentre il protocollo FTP e al livello applicazione. L'FTP non sa se è trasferito in modo TCP o UDP. In VB se usi il comando WSOCK devi esegure i comandi del protocollo FTP. Io ti sconsiglio di farlo in VB perche il controllo WSOCK e abbastanza scadente. Consiglierei C o java. Cmq la soluzione giusta per te e cercare un componente che gestisca il colloquio.
FTP è a trasferito con il TCP...e questo è appurato...
Il TFTP è trasferito con UDP...

Se hai una connessione TCP dopo inviando i comandi che implementano correttamente il protocollonon ci dovrebbero essere problemi...

VICIUS
06-10-2003, 18:16
Originariamente inviato da GogetaSSJ
Scusa l'ignoranza ma sono un novellino. Come faccio ad utilizzare correttamente l'API? (ora la sparo pure grossa... che cos'è un API?)

Se incollo le 2 porzioni di codice in un progetto mi dice che non posso utilizzare matrici ecc... in una dichiarazione pubblica (riferendosi alla prima porzione di codice da te menzionato)

Grazie ancora per la disponibilità e la pazienza

Be le api sono un interfaccia che l'autore della libreria o del programma ti mette a disposizione per interagire con lo stesso.

dovresti mettere tutto quello che ti ho messo nella parte di api in un modulo publico del tuo progetto, che sarebbe un .bas se non ricordo male.

mentre l'altro pezzo è normalissimo codice che puoi mettere dove ti pare, in un bottone una checkbox ecc. ecc.

ciao ;)

GogetaSSJ
06-10-2003, 18:43
Oddio cionci, che è quella roba che mi hai postato?? Sembra una specie di client ftp, però può darsi che mi sbagli.
Se così fosse....:confused:
io me la sono cavato con un paio di Funciont e pochissime righe di codifica.

Cmq grazie a tutti, ora provo a usare le api da voi segnalate ;)

cionci
06-10-2003, 18:51
Prova le API che ti ho passato io...che implementano già il protocollo FTP...

Il programma sopra fa ciò che chiedi...
Sui collega ad un server FTP, crea una directory, fa l'upload di un file, rinomina un file remoto, fa il download di un file, cancella un file remoto, cancella una directory...

GogetaSSJ
06-10-2003, 19:59
Si ma è incredibilmente complesso (almeno per ora per me). Ti ripeto che con 6 o 7 righe di codice sono riuscito a fare perfettamente quello che volevo, ora devo solo controllare lo stato della connessione.

Ovviamente grazie per le dritte datemi finora