使用Indy测量网络流量

jpf*_*ius 5 delphi networking client-server indy

我正在使用TIdTCPCmdServer来处理与客户端应用程序的所有通信.我希望我的服务器记录所有类型的东西,包括网络流量.有没有简单或聪明的方法来查看TCPCmdServer实际收到和发送了多少字节?我只能想到代码

ASender.SendReply;
Inc (FTraffic, Sizeof (ASender.NormalReply.Code) +
               Sizeof (Char) * ASender.NormalReply.Text.Length));
Run Code Online (Sandbox Code Playgroud)

这在我看来非常难看,因为这些流量更新会在我的代码中传播,并且相当复杂.

有什么建议?

谢谢你的帮助.

mgh*_*hie 7

查看Indy的拦截类.您应该能够创建一个自定义拦截类来覆盖Receive()和Send()方法,并且除了调用基类的方法之外,还可以实现流量计算.已经有拦截类来进行日志记录,您可以以相同的方式连接自定义类.

TIdConnectionIntercept的文档应该是一个很好的起点.还有一个很简单的例子,在这里就如何创建并在运行时连接拦截.


jpf*_*ius 3

非常感谢你们两位的回答。我选择按照 mghie 描述的方式来实现它 - 通过为我的连接实现自定义拦截器类。对于那些对该解决方案感兴趣的人,我将在这里提供一些源代码:

type
  TCountTrafficInterceptor = class (TIdConnectionIntercept)
  public
    type TIntPointer = ^Longint;
  private
    FTraffic : TIntPointer;
  public
    constructor Create (TrafficVar : TIntPointer);
    procedure Send (var ABuffer : TIdBytes); override;
    procedure Receive (var ABuffer : TIdBytes); override;
  end;

constructor TCountTrafficInterceptor.Create (TrafficVar : TIntPointer);
begin
  FTraffic := TrafficVar;
end;

procedure TCountTrafficInterceptor.Send (var ABuffer : TIdBytes);
begin
  inherited Send (ABuffer);
  FTraffic^ := FTraffic^ + Length (ABuffer);
end;

procedure TCountTrafficInterceptor.Receive (var ABuffer : TIdBytes);
begin
  inherited Receive (ABuffer);
  FTraffic^ := FTraffic^ + Length (ABuffer);
end;
Run Code Online (Sandbox Code Playgroud)

在 TIdTCPCmdServer 的 OnConnect 方法中:

AContext.Connection.IOHandler.Intercept := 
  TCountTrafficInterceptor.Create (@FNetworkTraffic);
Run Code Online (Sandbox Code Playgroud)

效果很好,正是我正在寻找的解决方案。再次感谢您的回答。

顺便说一句:我如何在我的帖子中使用 (at) 符号?当我尝试输入时,我总是得到一个块引用......