Delphi 用Indy测量网络流量

Delphi 用Indy测量网络流量,delphi,networking,client-server,indy,Delphi,Networking,Client Server,Indy,我使用一个TIdTCPCmdServer来处理与客户端应用程序的所有通信。我想我的服务器记录所有的东西,包括网络流量。有没有简单或聪明的方法来查看TCPCmdServer实际接收和发送了多少字节?我只能想到这样的代码 ASender.SendReply; Inc (FTraffic, Sizeof (ASender.NormalReply.Code) + Sizeof (Char) * ASender.NormalReply.Text.Length)); 这在我看

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

ASender.SendReply;
Inc (FTraffic, Sizeof (ASender.NormalReply.Code) +
               Sizeof (Char) * ASender.NormalReply.Text.Length));
这在我看来是非常难看的,因为这些流量更新会散布在我的代码中,而且相当复杂

有什么建议吗


感谢您的帮助。

TCPCmdServer
包装到记录流量的类中

您可以从TCPCmdServer派生类,并重写发送和接收方法(如果它们是虚拟的)

比如:

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并公开所需的方法和属性。

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


文档化应该是一个很好的起点。还有一个关于如何在运行时创建和连接拦截的非常简单的示例。

非常感谢你们的回答。我选择了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)标志?当我尝试键入时,总是会得到一个大引号…

+1谢谢!我像你建议的那样实现了它,并用一些源代码添加了一个新的答案