2009-02-18 97 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