问题是我需要限制下载速度(必须是可配置的,例如1 KB/s、1 MB/s等),但我无法使其工作。我知道一些道具,比如
BitsPerSec
等等,但这只影响协议数据交换,而不影响与的文件交换
RETR
命令
比特斯佩尔塞克
是的属性
TIdInterceptThrottler
类(以及
RecvBitsPerSec
和
SendBitsPerSec
TIdTCPConnection
通过its的对象
Intercept
所有物这不仅限于命令连接,还可以用于传输连接。
您可以访问
TIDTCP连接
文件传入的对象
TIdFTPServer
通过
TIdFTPServerContext.DataChannel.FDataChannel
成员,例如
OnRetrieveFile
事件:
type
// the TIdDataChannel.FDataChannel member is 'protected',
// so use an accessor class to reach it...
TIdDataChannelAccess = class(TIdDataChannel)
end;
procedure TForm1.IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext;
const AFileName: TIdFTPFileName; var VStream: TStream);
var
Conn: TIdTCPConnection;
begin
Conn := TIdDataChannelAccess(ASender.DataChannel).FDataChannel;
if Conn.Intercept = nil then
Conn.Intercept := TIdInterceptThrottler.Create(Conn);
TIdInterceptThrottler(Conn.Intercept).BitsPerSec := ...;
VStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
end;
T(File)Stream
用于重写虚拟
Read()
和
Write()
VStream
参数
和
OnStoreFile
事件。
我明白了
IdFTPServer.pas
,流被转换为字符串,并使用repeat/until循环发送(使用IOHandler.Write())
不,流不会转换为字符串。你误读了代码。流的内容在对
IOHandler.Write(TStream)
方法
但我需要某种形式的控制上传/下载过程,并能够限制所有传入客户端连接的速度。
见上文。
你不应该处理
命令
.
TIdFTPServer
已经为你做了。你应该使用
事件来准备下载