You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FtpWebRequest连接FileZilla服务器时出现GnuTLS -110与425错误求助

VB.NET FTP上传成功但触发TLS连接错误的排查与修复

问题分析

从FileZilla日志可见,文件传输完成后出现GnuTLS error -110和Client did not properly shut down TLS connection错误,最终返回425连接中止。核心原因是代码仅完成数据写入,但未正确结束FTP会话——启用SSL的FtpWebRequest要求发送数据后必须获取服务器响应,才能完成TLS连接的优雅关闭,否则服务器会判定连接异常中断。

代码问题点

原代码在写完请求流后直接返回,未调用GetResponse()接收服务器的最终响应,导致TLS连接未正常关闭,触发错误。

修复后的代码

Dim ftpserver As String = server.Text
Dim username As String = usn.Text
Dim password As String = pass.Text
Dim localpath As String = file.Text

Dim localfilename As String = IO.Path.GetFileName(localpath)
Dim uploadurl As String = ftpserver & "/" & localfilename

Dim fileInfo As New FileInfo(localpath)

Dim req As FtpWebRequest = DirectCast(WebRequest.Create(uploadurl), FtpWebRequest)
req.Credentials = New NetworkCredential(username, password)
req.Method = WebRequestMethods.Ftp.UploadFile
req.EnableSsl = True
req.UseBinary = True
req.KeepAlive = False
req.UsePassive = False
req.ContentLength = fileInfo.Length
req.Timeout = 4000
ServicePointManager.ServerCertificateValidationCallback = Function(sender, certificate, chain, sslPolicyErrors) True    '忽略客户端证书

Dim bufferlength As Integer = 2048
Dim buffer(bufferlength - 1) As Byte
Dim bytessent As Long = 0
Dim filelength As Long = fileInfo.Length

Try
    Using stream As Stream = req.GetRequestStream()
        Using filestream As FileStream = fileInfo.OpenRead()
            Dim contentlength As Integer = filestream.Read(buffer, 0, bufferlength)

            Do While contentlength <> 0
                stream.Write(buffer, 0, contentlength)
                contentlength = filestream.Read(buffer, 0, bufferlength)

                bytessent += contentlength
                Dim percentage As Integer = CInt((bytessent * 100) / filelength)

                worker.ReportProgress(percentage)
            Loop
        End Using
    End Using

    ' 关键修复:获取服务器响应,完成FTP会话的正确关闭
    Using resp As FtpWebResponse = DirectCast(req.GetResponse(), FtpWebResponse)
        ' 可在此检查响应状态,确认上传结果
        If resp.StatusCode = FtpStatusCode.ClosingData Then
            ' 上传完成的自定义逻辑
        End If
    End Using

    Return 1

Catch ex As Exception
    MessageBox.Show(ex.Message)
    Return 0
End Try

额外说明

  • 启用SSL的FTP连接必须通过获取响应完成会话优雅关闭,否则服务器会抛出TLS连接异常。
  • GetResponse()会等待服务器返回最终上传确认(如226 Transfer complete),确保整个FTP流程完整结束。

内容的提问来源于stack exchange,提问作者Cheryl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:13:13