Bonjour, à tous,
J'ai besoin dans un de mes programmes d'effectuer des transferts par Sftp.
Dans ce dessein, je tente d'utiliser l'assemblage .Net distribué par la société atp-inc.
Je ne suis pas familiarisé avec Dotnet et je tâtonne un peu
J'utilise le mode asynchrone pour ne pas bloquer l'utilisateur et avoir la possibilité d'effectuer plusieurs transferts simultanés.
Voilà l'exemple (en VB) fournis par l'éditeur :
Que j'ai traduit de la façon suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 Public Sub DoAsyncConnect() ' Create a new instance. Dim client As New Sftp() AddHandler client.HostKeyVerifying, AddressOf client_HostKeyVerifying AddHandler client.ConnectCompleted, AddressOf client_ConnectCompleted AddHandler client.AuthenticateCompleted, AddressOf client_AuthenticateCompleted AddHandler client.DisconnectCompleted, AddressOf client_DisconnectCompleted ' Connect to the SFTP server asynchronously. client.BeginConnect("myserver") ' Or you can specify the SFTP port with ' client.BeginConnect("myserver", 22); ' Your code here ' ... End Sub Private Sub client_ConnectCompleted(ByVal sender As Object, _ ByVal e As AsyncMethodCompletedEventArgs) Dim client As Sftp = CType(sender, Sftp) Try client.EndConnect(e.AsyncResult) Catch exc As Exception Console.WriteLine("Error: " & exc.ToString()) Return End Try ' Authenticate the user asynchronously. client.BeginAuthenticate("userName", "password") End Sub Private Sub client_AuthenticateCompleted(ByVal sender As Object, _ ByVal e As AsyncMethodCompletedEventArgs) Dim client As Sftp = CType(sender, Sftp) Try client.EndAuthenticate(e.AsyncResult) Catch exc As Exception Console.WriteLine("Error: " & exc.ToString()) Return End Try ' Do something here... client.DownloadFile("/my remote file.dat", "my local file") ' ... ' Disconnect asynchronously. client.BeginDisconnect() End Sub Private Sub client_DisconnectCompleted(ByVal sender As Object, _ ByVal e As AsyncMethodCompletedEventArgs) Dim client As Sftp = CType(sender, Sftp) Try client.EndDisconnect(e.AsyncResult) Catch exc As Exception Console.WriteLine("Error: " & exc.ToString()) End Try End Sub Private Sub client_HostKeyVerifying(ByVal sender As Object, _ ByVal e As HostKeyVerifyingEventArgs) ' Show host key. Console.WriteLine("HostKey: " & e.HostKey) ' Check the key here ' ... End Sub
Cela fonctionne correctement, il passe bien par mes différentes procédures.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 clMYSftp est un Sftp() pclHostKeyVerif est un HostKeyVerifyingEventHandler dynamique pclHostKeyVerif = clMYSftp:add_HostKeyVerifying(DotNetDélégué(PROC_HostKeyVerifying, "HostKeyVerifyingEventHandler")) pclConnectionVer est un AsyncCompletedEventHandler dynamique pclConnectionVer = clMYSftp:add_ConnectCompleted(DotNetDélégué(PROC_ConnexionComplète, "EventHandler<AsyncMethodCompletedEventArgs>")) pclAuthentificationComplète est un AsyncCompletedEventHandler dynamique pclAuthentificationComplète = clMYSftp:add_AuthenticateCompleted(DotNetDélégué(PROC_AuthentificationComplete, "EventHandler<AsyncMethodCompletedEventArgs>")) pclDéconnexionComplète est un AsyncCompletedEventHandler dynamique pclDéconnexionComplète = clMYSftp:add_DisconnectCompleted(DotNetDélégué(PROC_DéconnexionComplète, "EventHandler<AsyncMethodCompletedEventArgs>")) Trace("Start") clMYSftp.BeginConnect("192.168.1.2") Trace("End")
Je récupère ma clé :
Je procède à l'authentification sur le serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 PROCEDURE PROC_HostKeyVerifying(clObject, clEvenement) pclHostKey est un objet HostKeyVerifyingEventArgs dynamique = clEvenement Trace("PROC_HostKeyVerifying") Trace(pclHostKey.HostKey)
Une fois ma connexion et mon authentification terminé, je procède au transfert du fichier et à la déconnexion :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 PROCEDURE PROC_ConnexionComplète(clObject, clEvenement) Trace("PROC_ConnexionComplète") clObject.BeginAuthenticate("root", "passwd")
Mon problème réside dans le fait qu'il passe par toutes les procédures quel que soit le résultat de la connexion (mauvaise IP par exemple) et de l'authentification.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 PROCEDURE PROC_AuthentificationComplete(clObject, clEvenement) Trace("PROC_AuthentificationComplete") Trace("Transfert") Trace("BeginDisconnect") clObject.BeginDisconnect()
Je suppose que c'est cette partie du code qui devrait arrêter le traitement, mais je ne parviens pas à l'implémenter correctement :
Je vous remercie par avance pour vos conseils.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Try client.EndConnect(e.AsyncResult) Catch exc As Exception Console.WriteLine("Error: " & exc.ToString()) Return End Try
Partager