TCP Client fehler ordner struktur auslesen "MLSD" "List"

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    TCP Client fehler ordner struktur auslesen "MLSD" "List"

    Hallo Liebe gemeinde,
    aktuell versuche ich mich einen TCPClient zu basteln(kompletter anfänger was netzwerk angeht), was auch bis jetzt auch funktioniert.
    Der server ist ein Filezilla server. Die connection funktioniert mit dem Filezilla Client auch.
    Jedoch wenn ich versuche mit meinem Client die Ordnerstruktur auszulesen, bekomme ich diese Fehlermeldung.

    "425 Can't open data connection for transfer of "/" "

    irgendwas muss ich vergessen haben, hat jemand eine Idee?

    Anbei der Code:

    VB.NET-Quellcode

    1. Public Sub ftpLogin(ByVal strName As String, ByVal strPWD As String, ByVal strftpLogin As String, ByVal Login_Form As Login)
    2. Try
    3. Dim strCommand As String
    4. Dim strReturnMessage As String
    5. Dim bteSendBytes() As Byte
    6. Dim bteRetruenBytes() As Byte = Nothing
    7. Dim intReturnByteLength As Integer
    8. Main_Ritchtextbox.AppendText("Verbinde zu FTP-Adresse: " & strftpLogin & vbNewLine)
    9. FTP_Tcp_Client = New TcpClient(strftpLogin, 990)
    10. Parent_Form.FTP_Tcp_Client = FTP_Tcp_Client
    11. sslStream = New SslStream(FTP_Tcp_Client.GetStream(), False, New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing)
    12. If FTP_Tcp_Client.Connected = True Then
    13. Main_Ritchtextbox.AppendText("Mit TZCADDesign FTP-Server Verbunden" & vbNewLine)
    14. End If
    15. Dim testcert As X509CertificateCollection = Nothing
    16. 'sslStream.AuthenticateAsClient()
    17. Try
    18. sslStream.AuthenticateAsClient("", testcert, System.Security.Authentication.SslProtocols.Tls, True)
    19. Catch e As AuthenticationException
    20. Dim msg As String = ""
    21. msg &= "Exception: " & e.Message
    22. If e.InnerException IsNot Nothing Then
    23. msg &= "Inner exception: " & e.InnerException.Message
    24. End If
    25. msg &= "Authentication failed - closing the connection."
    26. FTP_Tcp_Client.Close()
    27. End Try
    28. Main_Ritchtextbox.AppendText("Sende Usernamen" & vbNewLine)
    29. strCommand = "USER " + strName + vbCrLf
    30. bteSendBytes = Encoding.ASCII.GetBytes(strCommand)
    31. sslStream.Write(bteSendBytes, 0, bteSendBytes.Length)
    32. intReturnByteLength = FTP_Tcp_Client.ReceiveBufferSize
    33. ReDim bteRetruenBytes(intReturnByteLength)
    34. sslStream.Read(bteRetruenBytes, 0, intReturnByteLength)
    35. strReturnMessage = Encoding.ASCII.GetString(bteRetruenBytes) + "/ "
    36. Main_Ritchtextbox.AppendText("Sende Passwort" & vbNewLine)
    37. strCommand = "PASS " + strPWD + vbCrLf
    38. Array.Clear(bteSendBytes, 0, bteSendBytes.Length)
    39. bteSendBytes = Encoding.ASCII.GetBytes(strCommand)
    40. sslStream.Write(bteSendBytes, 0, bteSendBytes.Length)
    41. intReturnByteLength = FTP_Tcp_Client.ReceiveBufferSize
    42. ReDim bteRetruenBytes(intReturnByteLength)
    43. sslStream.Read(bteRetruenBytes, 0, intReturnByteLength)
    44. strReturnMessage = Encoding.ASCII.GetString(bteRetruenBytes) + "/ "
    45. sslStream.Read(bteRetruenBytes, 0, intReturnByteLength - 1)
    46. Main_Ritchtextbox.AppendText("Nachricht vom Server: ")
    47. If Encoding.ASCII.GetString(bteRetruenBytes) Like "530*" Then
    48. Main_Ritchtextbox.AppendText("Loginname oder Passwort Falsch" & vbNewLine)
    49. FTP_Tcp_Client.Client.Close()
    50. ElseIf Encoding.ASCII.GetString(bteRetruenBytes) Like "230*" Then
    51. Login_Form.Hide()
    52. Main_Ritchtextbox.AppendText("Sie sind eingeloggt" & vbNewLine)
    53. Else
    54. Main_Ritchtextbox.AppendText("Unbekanter Fehler wenden Sie sich an Info@sw-trainer.de" & vbNewLine)
    55. FTP_Tcp_Client.Client.Close()
    56. End If
    57. FTPCommands(sslStream, "AUTH TLS ", strReturnMessage)
    58. FTPCommands(sslStream, "SYST ", strReturnMessage)
    59. FTPCommands(sslStream, "FEAT ", strReturnMessage)
    60. FTPCommands(sslStream, "PBSZ 0", strReturnMessage)
    61. FTPCommands(sslStream, "PROT P", strReturnMessage)
    62. FTPCommands(sslStream, "PWD", strReturnMessage)
    63. FTPCommands(sslStream, "PASV", strReturnMessage)
    64. FTPCommands(sslStream, "MLSD", strReturnMessage)
    65. Catch ex As SocketException
    66. ReturnPwdMessage = ex.Message
    67. End Try
    68. End Sub
    So habe einen kleinen erfolg verzeichnet, konnte einen Verbindung aufbauen jedoch nicht mit einer ssl verbindung. Also Über port 21(ohne Zerftifikat) funktioniert es :-(. Jedoch würde ich gerne eine Verbindung mit Zertifikat aufbauen, was passt nicht?

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Imports System.IO
    4. Imports System.Net.Sockets
    5. Imports System.Text
    6. Imports System.Windows.Forms
    7. Imports System.Security.Cryptography.X509Certificates
    8. Imports System.Net.Security
    9. Imports System.Security.Authentication
    10. Public Class FTP_Functions
    11. Public sslStream As SslStream
    12. Public SendFTPMessage As String
    13. Public ReturnFTPMessage As String
    14. Public Main_Ritchtextbox As RichTextBox
    15. Public FTP_Transfer_Socket As Socket = Nothing
    16. Public FTP_Transfer_IPEndPoint As IPEndPoint = Nothing
    17. Dim FTP_Adress As String
    18. Dim FTP_Tcp_Client As TcpClient
    19. Dim Parent_Form As Form1
    20. Dim Buffer_Byte(512) As Byte
    21. Public Sub New(ByVal Main_Ritchtextbox_Temp As RichTextBox, ByVal Parent_Form_Temp As Form1)
    22. Parent_Form = Parent_Form_Temp
    23. Main_Ritchtextbox = Main_Ritchtextbox_Temp
    24. End Sub
    25. Public Sub LogInFTP(ByVal Login_Name As String, ByVal Login_PW As String, ByVal FTP_Adress_Temp As String, ByVal Login_Form As Form)
    26. FTP_Adress = FTP_Adress_Temp
    27. Main_Ritchtextbox.AppendText("Verbinde zu FTP-Adresse: " & FTP_Adress & vbNewLine)
    28. FTP_Tcp_Client = New TcpClient(FTP_Adress, 990)
    29. Parent_Form.FTP_Tcp_Client = FTP_Tcp_Client
    30. sslStream = New SslStream(FTP_Tcp_Client.GetStream(), False, New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing)
    31. If FTP_Tcp_Client.Connected = True Then
    32. Main_Ritchtextbox.AppendText("Mit TZCADDesign FTP-Server Verbunden" & vbNewLine)
    33. End If
    34. Dim Temp_Cert As X509CertificateCollection = Nothing
    35. Try
    36. sslStream.AuthenticateAsClient("", Temp_Cert, System.Security.Authentication.SslProtocols.Tls, True)
    37. Catch e As AuthenticationException
    38. Dim msg As String = ""
    39. msg &= "Exception: " & e.Message
    40. If e.InnerException IsNot Nothing Then
    41. msg &= "Inner exception: " & e.InnerException.Message
    42. End If
    43. msg &= "Authentication failed - closing the connection."
    44. FTP_Tcp_Client.Close()
    45. End Try
    46. SendFTPCommand("AUTH TLS ", True)
    47. If FTP_Tcp_Client.Connected = True Then
    48. Main_Ritchtextbox.AppendText("Sende Usernamen & Passwort" & vbNewLine)
    49. SendFTPCommand("USER " & Login_Name, True)
    50. ReadFTPMessage(False)
    51. SendFTPCommand("PASS " & Login_PW)
    52. If ReturnFTPMessage Like "530*" Then
    53. Main_Ritchtextbox.AppendText("Loginname oder Passwort Falsch" & vbNewLine)
    54. FTP_Tcp_Client.Client.Close()
    55. Exit Sub
    56. ElseIf ReturnFTPMessage Like "230*" Then
    57. Login_Form.Hide()
    58. Main_Ritchtextbox.AppendText("Sie sind eingeloggt" & vbNewLine)
    59. Else
    60. Main_Ritchtextbox.AppendText("Unbekanter Fehler wenden Sie sich an Info@sw-trainer.de" & vbNewLine)
    61. FTP_Tcp_Client.Client.Close()
    62. Exit Sub
    63. End If
    64. SendFTPCommand("SYST", True)
    65. SendFTPCommand("FEAT", True)
    66. SendFTPCommand("PBSZ 0", True)
    67. SendFTPCommand("PROT P", True)
    68. SendFTPCommand("PWD", True)
    69. GetfileList()
    70. End If
    71. End Sub
    72. Private CertificateErrors As New Hashtable()
    73. Public Function ValidateServerCertificate(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors__1 As SslPolicyErrors) As Boolean
    74. Debug.Print(certificate.GetName)
    75. Return True
    76. End Function
    77. Private Sub SendFTPCommand(ByVal FTP_Command As String, Optional ByVal AddtoRitchbox As Boolean = False, Optional ByVal Transfer As Boolean = False)
    78. Buffer_Byte = Encoding.ASCII.GetBytes(FTP_Command + vbCrLf)
    79. sslStream.Write(Buffer_Byte, 0, Buffer_Byte.Length)
    80. If Transfer = False Then
    81. ReadFTPMessage(AddtoRitchbox)
    82. Else
    83. Read_FTP_Transfer_Message(AddtoRitchbox)
    84. End If
    85. End Sub
    86. Private Sub ReadFTPMessage(ByVal AddtoRitchbox As Boolean)
    87. Dim intReturnByteLength As Integer
    88. intReturnByteLength = FTP_Tcp_Client.ReceiveBufferSize
    89. ReDim Buffer_Byte(intReturnByteLength)
    90. sslStream.Read(Buffer_Byte, 0, intReturnByteLength)
    91. ReturnFTPMessage = Encoding.ASCII.GetString(Buffer_Byte)
    92. Debug.Print(ReturnFTPMessage)
    93. If AddtoRitchbox Then
    94. Main_Ritchtextbox.AppendText("Nachricht vom Server: " & ReturnFTPMessage)
    95. End If
    96. End Sub
    97. Private Sub Read_FTP_Transfer_Message(ByVal AddtoRitchbox As Boolean)
    98. Dim intReturnByteLength As Integer
    99. Dim timeout As DateTime = DateTime.Now.AddSeconds(30)
    100. ReDim Buffer_Byte(512 - 1)
    101. Do
    102. intReturnByteLength = FTP_Transfer_Socket.Receive(Buffer_Byte, Buffer_Byte.Length, 0)
    103. ReturnFTPMessage = Encoding.ASCII.GetString(Buffer_Byte, 0, intReturnByteLength)
    104. Debug.Print(ReturnFTPMessage)
    105. Loop While timeout > DateTime.Now
    106. If AddtoRitchbox Then
    107. Main_Ritchtextbox.AppendText("Nachricht vom Server: " & ReturnFTPMessage)
    108. End If
    109. Array.Clear(Buffer_Byte, 0, Buffer_Byte.Length)
    110. End Sub
    111. Private Function ChangeToPassiveMode(ByVal FTP_Adress As String) As Socket
    112. Dim Transfersocket As Socket = Nothing
    113. SendFTPCommand("PASV ")
    114. If ReturnFTPMessage Like "227*" Then
    115. Dim indx1 As Integer = ReturnFTPMessage.IndexOf(Microsoft.VisualBasic.ChrW(40))
    116. Dim indx2 As Integer = ReturnFTPMessage.IndexOf(Microsoft.VisualBasic.ChrW(41))
    117. Dim Ip_Port_temp As String = ReturnFTPMessage.Substring((indx1 + 1), (indx2 - indx1) - 1)
    118. Dim Ip_Port_parts() As String = Split(Ip_Port_temp, ",")
    119. Dim Ip_Port As Integer = CInt((CInt(Ip_Port_parts(4)) * 256) + CInt(Ip_Port_parts(5)))
    120. Transfersocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    121. Transfersocket.Connect(IPAddress.Parse(FTP_Adress), Ip_Port)
    122. End If
    123. Return Transfersocket
    124. End Function
    125. Public Sub GetfileList()
    126. FTP_Transfer_Socket = ChangeToPassiveMode(FTP_Adress)
    127. SendFTPCommand("MLSD ", True)
    128. Read_FTP_Transfer_Message(True)
    129. End Sub
    130. End Class
    Hört sich interessant an, schaue mir das mal an.
    Erstelle es jetzt aber erstmal über port 21 ohne zertifikat.

    Ich habe auch schon herausgefunden woran es liegt.

    VB.NET-Quellcode

    1. intReturnByteLength = FTP_Transfer_Socket.Receive(Buffer_Byte, Buffer_Byte.Length, 0)


    Hier bekomme ich nichts vom server. Das liegt anscheinend am Protokoll typen.

    Edit:

    Habe mal beide NuGet Pakete installiert.

    Das Renci SSH.net sieht schon interessant aus :) . Werde es beim Update Tool mal einsetzen und für mich testen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()