使用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
相关产品推荐
相关产品推荐

