2009-02-18 8 views
5

J'utilise un TIdTCPCmdServer pour gérer toutes les communications avec les applications client. Je voudrais que mon serveur enregistre toutes sortes de choses, y compris le trafic réseau. Existe-t-il un moyen simple ou intelligent de voir combien d'octets le serveur TCPCmdServer a réellement reçu et envoyé? Je ne peux penser à un code commeMesure du trafic réseau avec Indy

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

qui est extrêmement laid à mon avis, parce que ces mises à jour de la circulation seraient spreaded sur tout mon code et sont assez compliquées aussi bien.

Des suggestions?

Merci pour votre aide.

Répondre

3

Merci beaucoup à vous deux pour vos réponses. J'ai choisi de l'implémenter comme mghie l'a décrit - en implémentant une classe d'intercepteur personnalisée pour mes connexions. Juste pour les personnes intéressées par la solution, je fournirai un code source ici:

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; 

Et dans la méthode OnConnect du TIdTCPCmdServer:

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

fonctionne très bien, le genre de solution que je cherchais pour. Merci encore pour vos réponses. Btw: Comment utiliser le signe (at) dans mes articles? Je reçois toujours une citation de bloc quand j'essaye de la taper ...

4

Enveloppez TCPCmdServer dans la classe qui enregistre le trafic.

Vous pouvez dériver votre classe à partir de TCPCmdServer et remplacer les méthodes d'envoi et de réception si elles sont virtuelles.

Quelque chose comme:

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 elles ne sont pas virtuelles, puis créer une nouvelle classe qui instancie TCPCmdServer et exposer les méthodes et les propriétés requises.

7

Regardez dans les classes d'interception d'Indy. Vous devriez être capable de créer une classe d'interception personnalisée qui substitue les méthodes Receive() et Send(), et en plus d'appeler les méthodes de la classe de base implémente votre calcul de trafic. Il existe déjà des classes d'interception pour la journalisation, vous connecteriez votre classe personnalisée de la même manière.

La documentation de TIdConnectionIntercept devrait être un bon point de départ. Il y a aussi un exemple très simple here sur la façon de créer et de connecter une interception à l'exécution.

+0

+ Merci! Je l'ai implémenté comme vous l'avez proposé et ajouté une nouvelle réponse avec du code source – jpfollenius

Questions connexes