我目前正在尝试使用我们的一款产品中的 FTP 上传功能来调试客户的问题。该功能允许客户将文件 (< 1MB) 上传到中央 FTP 服务器以进行进一步处理。FTP 客户端代码是用 VB.NET 内部编写的。
客户报告在尝试上传 300KB 到 500KB 范围内的文件时收到“远程主机强制关闭连接”错误。但是,我们使用更大的文件(相对而言)(即 3MB 及以上)在内部对此进行了测试,但从未收到此错误。我们使用相同的 FTP 登录凭据上传到客户端连接到的同一 FTP 服务器,唯一的区别是我们是在办公室完成的。
我知道 TCP 协议具有内置的流量控制,因此在单个 Send 调用中发送多少数据并不重要,因为该协议会相应地限制自己以匹配服务器的内部限制(如果我没记错的话。 ..)
因此,我唯一能想到的是,客户端和路由器之间的中间主机人为地对客户端进行限速并断开连接(我们以 512 字节块的形式循环发送文件数据)。
这是用于发送数据的循环(缓冲区是包含文件数据的字节数组):
For i = 0 To buffer.Length - 1 Step 512
mDataSocket.Send(buffer, i, 512, SocketFlags.None)
OnTransferStatus(i, buffer.Length)
Next
客户的 ISP(或他们自己的防火墙)是否有可能对我们的客户端代码在给定时间段内可以发送的数据量施加人为的速率限制?如果是这样,处理这种情况的最佳方法是什么?我想显而易见的解决方案是在我们的发送循环中引入延迟,除非有办法在套接字级别执行此操作。
对我来说,ISP 会通过终止客户端连接来处理速率限制违规,这似乎真的很奇怪。为什么他们不只依赖 TCP/IP 的内部流量控制/节流机制?