使用Indy测量网络流量

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

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

这在我看来很是难看,由于这些流量更新会在个人代码中传播,而且至关复杂。 服务器

有什么建议? 网络

谢谢你的帮助。 ide


#1楼

TCPCmdServer包装到记录流量的类中。 spa

您能够从TCPCmdServer派生您的类,并覆盖发送和接收方法(若是它们是虚拟的)。 日志

就像是: code

type
  TTcpCmdServerWithLogging = class(TTcpCmdServer)
    ...
    procedure SendReply; override;

implementation
    procedure SendReply;
    begin
      inherited SendReply;
      Inc (FTraffic, Sizeof (NormalReply.Code) +
           Sizeof (Char) * NormalReply.Text.Length)); 
    end;

若是它们不是虚拟的,则建立实例化TCPCmdServer并公开所需方法和属性的新类。 orm


#2楼

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

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


#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;

在TIdTCPCmdServer的OnConnect方法中:

AContext.Connection.IOHandler.Intercept := 
  TCountTrafficInterceptor.Create (@FNetworkTraffic);

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

顺便说一句:我如何在帖子中使用(at)标志? 当我尝试输入时,我老是获得一个块引用...

相关文章
相关标签/搜索