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 :

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
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
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")
Cela fonctionne correctement, il passe bien par mes différentes procédures.

Je récupère ma clé :

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)
Je procède à l'authentification sur le serveur :

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")
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
6
7
8
9
PROCEDURE PROC_AuthentificationComplete(clObject, clEvenement)
 
Trace("PROC_AuthentificationComplete")
 
Trace("Transfert")
 
Trace("BeginDisconnect")
 
clObject.BeginDisconnect()
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.

Je suppose que c'est cette partie du code qui devrait arrêter le traitement, mais je ne parviens pas à l'implémenter correctement :

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
Je vous remercie par avance pour vos conseils.