2009-02-18 15 views
5

Estoy usando un TIdTCPCmdServer para manejar todas las comunicaciones con las aplicaciones del cliente. Me gustaría que mi servidor registrara todo tipo de cosas, incluido el tráfico de red. ¿Hay alguna manera fácil o inteligente de ver cuántos bytes el TCPCmdServer realmente recibió y envió? Sólo puedo pensar en un código comoMedición del tráfico de la red con Indy

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

que es extremadamente fea en mi opinión porque estas actualizaciones de tráfico serían difundidos por todo mi código y son bastante complicados también.

¿Alguna sugerencia?

Gracias por su ayuda.

Respuesta

3

Muchas gracias a todos por sus respuestas. Elegí implementarlo como lo describió mghie, implementando una clase de interceptor personalizada para mis conexiones. Sólo para los interesados ​​en la solución, voy a proporcionar algo de código fuente aquí:

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; 

Y en el método OnConnect del TIdTCPCmdServer:

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

Funciona muy bien, sólo el tipo de solución que estaba buscando para. Gracias de nuevo por tus respuestas.

Por cierto: ¿Cómo puedo usar el signo (at) en mis publicaciones? Siempre obtengo una cita de bloque cuando intento escribirla ...

4

Encapsule TCPCmdServer en la clase que registra el tráfico.

Puede derivar su clase de TCPCmdServer y anular los métodos de envío y recepción si son virtuales.

Algo así como:

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

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

Si ellos no son virtuales, a continuación, crear nuevas clases que instancia TCPCmdServer y exponer los métodos y las propiedades requeridas.

7

Mire las clases de interceptación de Indy. Debería poder crear una clase de interceptación personalizada que anule los métodos Receive() y Send(), y que además de llamar a los métodos de la clase base implemente su cálculo de tráfico. Ya hay clases de interceptación para hacer el registro, usted conectaría su clase personalizada de la misma manera.

La documentación de TIdConnectionIntercept debe ser un buen punto de partida. También hay un ejemplo muy simple here sobre cómo crear y conectar un interceptar en tiempo de ejecución.

+0

+1 ¡Gracias! Lo implementé como proponías y agregué una nueva respuesta con un código fuente – jpfollenius

Cuestiones relacionadas