2009-02-18 96 views
5

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

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

这在我看来是非常难看,因为这些更新的路况信息会被铺展了所有在我的代码和相当复杂也是如此。

有什么建议吗?

感谢您的帮助。

回答

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)标志?当我尝试输入时,我总是会得到一个块报价...

4

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新类和暴露所需的方法和属性。

7

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

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

+0

+1谢谢!我像你提议的那样实现它,并用一些源代码添加了一个新的答案 – jpfollenius 2009-02-18 13:32:10