2009-02-18 9 views
5

Ich verwende einen TIdTCPCmdServer, um die gesamte Kommunikation mit Clientanwendungen zu verarbeiten. Ich möchte, dass mein Server alle Arten von Daten einschließlich Netzwerkverkehr protokolliert. Gibt es eine einfache oder clevere Möglichkeit zu sehen, wie viele Bytes der TCPCmdServer tatsächlich empfangen und gesendet hat? Ich kann mir nur von Code wieMessen von Netzwerkverkehr mit Indy

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

die extrem hässlich ist meiner Meinung nach, weil diese Verkehrsinformationen über meinen Code gespreizt werden würde und sind auch ziemlich kompliziert.

Irgendwelche Vorschläge?

Danke für Ihre Hilfe.

Antwort

3

Vielen Dank für Ihre Antworten. Ich entschied mich dafür, es so zu implementieren, wie mghie es beschrieben hat - indem ich eine benutzerdefinierte Interceptor-Klasse für meine Verbindungen implementierte. Gerade für die Interessenten in der Lösung, werde ich hier einige Quellcode bereitstellen:

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; 

Und in der OnConnect Methode des TIdTCPCmdServer:

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

Funktioniert prima, genau die Art von Lösung, die ich war auf der Suche zum. Nochmals vielen Dank für Ihre Antworten.

Btw: Wie kann ich das (at) Zeichen in meinen Posts verwenden? Ich bekomme immer ein Blockzitat, wenn ich versuche, es einzugeben ...

4

Wrap TCPCmdServer in Klasse, die den Verkehr protokolliert.

Sie können Ihre Klasse von TCPCmdServer ableiten und Sende- und Empfangsmethoden überschreiben, wenn sie virtuell sind.

Etwas wie:

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

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

Wenn sie nicht virtuell sind, dann neue Klasse erstellen, die TCPCmdServer und belichten erforderlichen Methoden und Eigenschaften instanziiert.

7

Schauen Sie in die Intercept-Klassen von Indy. Sie sollten in der Lage sein, eine benutzerdefinierte Abfangklasse zu erstellen, die die Methoden Receive() und Send() außer Kraft setzt und zusätzlich zum Aufrufen der Methoden der Basisklasse die Verkehrsberechnung implementiert. Es gibt bereits Intercept-Klassen für die Protokollierung, Sie würden Ihre benutzerdefinierte Klasse auf die gleiche Weise verbinden.

Die Dokumentation von TIdConnectionIntercept sollte ein guter Ausgangspunkt sein. Es gibt auch ein sehr einfaches Beispiel here zum Erstellen und Verbinden eines Abschnitts zur Laufzeit.

+0

+1 Danke! Ich habe es so implementiert, wie Sie es vorgeschlagen haben, und eine neue Antwort mit Quellcode hinzugefügt – jpfollenius