5

クライアント アプリケーションとのすべての通信を処理するために TIdTCPCmdServer を使用しています。サーバーで、ネットワーク トラフィックを含むあらゆる種類のログを記録したいと考えています。TCPCmdServer が実際に送受信したバイト数を確認する簡単で巧妙な方法はありますか? みたいなコードしか思いつかない

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

私の意見では、これらのトラフィックの更新はコード全体に分散され、かなり複雑であるため、これは非常に醜いです。

助言がありますか?

ご協力いただきありがとうございます。

4

3 に答える 3

7

Indy のインターセプト クラスを調べます。Receive() メソッドと Send() メソッドをオーバーライドするカスタム インターセプト クラスを作成できるはずです。基本クラスのメソッドを呼び出すだけでなく、トラフィック計算を実装することもできます。ロギングを行うインターセプト クラスが既に存在するため、カスタム クラスを同じ方法で接続します。

TIdConnectionInterceptのドキュメントは、良い出発点になるはずです。実行時にインターセプトを作成して接続する方法に関する非常に簡単な例もここにあります。

于 2009-02-18T12:29:00.317 に答える
4

TCPCmdServerトラフィックをログに記録するクラスにラップします。

TCPCmdServerからクラスを派生させ、仮想の場合はsendメソッドとreceiveメソッドをオーバーライドできます。

何かのようなもの:

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をインスタンス化する新しいクラスを作成し、必要なメソッドとプロパティを公開します。

于 2009-02-18T09:36:25.240 に答える
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);

私が探していた種類のソリューションです。ご回答ありがとうございます。

ところで: 投稿で (アットマーク) 記号を使用するにはどうすればよいですか? 入力しようとすると、常にブロック引用符が表示されます...

于 2009-02-18T13:31:05.223 に答える