使用Indy測量網絡流量

我正在使用TIdTCPCmdServer來處理與客戶端應用程序的全部通訊。 我但願個人服務器記錄全部類型的東西,包括網絡流量。 有沒有簡單或聰明的方法來查看TCPCmdServer實際收到和發送了多少字節? 我只能想到代碼 html

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

這在我看來很是難看,由於這些流量更新會在個人代碼中傳播,而且至關複雜。 服務器

有什麼建議? 網絡

謝謝你的幫助。 ide


#1樓

TCPCmdServer包裝到記錄流量的類中。 spa

您能夠從TCPCmdServer派生您的類,並覆蓋發送和接收方法(若是它們是虛擬的)。 日誌

就像是: code

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並公開所需方法和屬性的新類。 orm


#2樓

查看Indy的攔截類。 您應該可以建立一個自定義攔截類來覆蓋Receive()和Send()方法,而且除了調用基類的方法以外,還能夠實現流量計算。 已經有攔截類來進行日誌記錄,您能夠以相同的方式鏈接自定義類。 htm

TIdConnectionIntercept的文檔應該是一個很好的起點。 還有一個很簡單的例子, 在這裏就如何建立並在運行時鏈接攔截。 文檔


#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)標誌? 當我嘗試輸入時,我老是獲得一個塊引用...

相關文章
相關標籤/搜索