2009-02-18 16 views
5

Używam TIdTCPCmdServer do obsługi całej komunikacji z aplikacjami klienckimi. Chciałbym, aby mój serwer rejestrował wszystkie rodzaje danych, w tym ruch sieciowy. Czy istnieje łatwy lub sprytny sposób sprawdzenia, ile bajtów serwer TCPCmdServer faktycznie otrzymał i wysłał? Mogę myśleć tylko o kodzie jakPomiar ruchu w sieci z Indy

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

który jest bardzo brzydki, bo moim zdaniem te aktualizacje ruchu będzie roz całego mojego kodu i są dość skomplikowane, jak również.

Wszelkie sugestie?

Dzięki za pomoc.

Odpowiedz

3

Dziękuję bardzo za odpowiedzi. Zdecydowałem się go zaimplementować tak, jak opisywał to mghie - implementując niestandardową klasę przechwytującą dla moich połączeń. Tylko dla osób zainteresowanych w roztworze, dam trochę kodu źródłowego tutaj:

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; 

A w metodzie onConnect z TIdTCPCmdServer:

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

działa świetnie, tylko rodzaj rozwiązania szukałem dla. Jeszcze raz dziękuję za odpowiedzi.

Przy okazji: Jak mogę użyć znaku (at) w moich postach? Zawsze otrzymuję blokowy cytat, gdy próbuję go wpisać ...

4

Zawiń TCPCmdServer do klasy, która rejestruje ruch.

Możesz wyprowadzić swoją klasę z TCPCmdServer i zastąpić metody wysyłania i odbierania, jeśli są wirtualne.

Coś jak:

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

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

Jeśli nie są wirtualne, a następnie utworzyć nową klasę, która tworzy wystąpienie TCPCmdServer i narazić wymaganych metod i właściwości.

7

Sprawdź klasy przechwytujące Indy. Powinieneś być w stanie stworzyć niestandardową klasę przechwytywania, która przesłania metody Receive() i Send(), a oprócz wywoływania metod klasy bazowej implementuje obliczenia ruchu. Istnieją już klasy przechwytujące do rejestrowania, w ten sam sposób połączasz swoją klasę niestandardową.

Dokumentacja TIdConnectionIntercept powinna być dobrym punktem wyjścia. Istnieje również bardzo prosty przykład here dotyczący tworzenia i łączenia przechwytywania w czasie wykonywania.

+0

+1 Dzięki! Zaimplementowałem to tak, jak zaproponowałeś i dodałem nową odpowiedź z pewnym kodem źródłowym – jpfollenius