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:
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:
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:
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:
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:
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:
1
2
3
4
5
6 Try client.EndConnect(e.AsyncResult) Catch exc As Exception Console.WriteLine("Error: " & exc.ToString()) Return End Try