2017-02-15 8 views
0

私はTCP Client-Serverアプリケーションを開発しています。TIdTCPServerから圧縮データサイズを取得するには?

私はクライアントに送信するパケットの圧縮サイズを取得しようとしています。そのサイズを圧縮されていないデータサイズと比較し、得られた圧縮率に関する統計を取得できます。

クライアント側。 OnSend/OnReceiveイベントのサイズと送受信したデータのサイズを比較すると、TIdCompressionInterceptの情報が得られます。これらのイベントハンドラのパラメータの長さを取得するだけです。

しかし、サーバー側では、TIdServerCompressionInterceptにフックするイベントがありません。

だから質問があります。サーバが送受信するパケットの圧縮サイズを取得するには、どうすればよいのですか?これらのサイズと、それらのパケットの生データサイズを比較できますか?

ありがとうございました。

クライアント側のコードサンプル:


var 
    FRawSentSize   , 
    FComrpessedSentSize  , 
    FRawReceivedSize  , 
    FCompressedReceivedSize : UInt64; 

function TFrom1.SendAndReceive(const ToSend: String): String; 
begin 
    TCPClient.IOHandler.WriteLn(ToSend); 
    Inc(FRawSentSize, Length(ToSend)); 
    Result := TCPClient.IOHandler.ReadLn; 
    Inc(FRawReceivedSize, Length(Result)); 
end; 

function TForm1.CompressorSend(ASender: TIdConnectionIntercept; var ABuffer: TIdBytes); 
begin 
    Inc(FComrpessedSentSize, Length(ABuffer)); 
end; 

function TForm1.CompressorReceive(ASender: TIdConnectionIntercept; var ABuffer: TIdBytes); 
begin 
    Inc(FCompressedReceivedSize, Length(ABuffer)); 
end; 

答えて

0

TIdServerCompressionInterceptは、実際の作業を行い切片ではないので、それはイベントがありません理由です。

新しいクライアントがサーバーに接続すると、TIdServerCompressionInterceptは、オブジェクトを作成し、AContext.Connection.IOHandler.Interceptプロパティに割り当てられます。そのオブジェクトは、クライアント側のコードと同様に、実際の作業を行います。サーバーのOnConnectまたはOnExecuteイベントハンドラは、必要に応じて、そのオブジェクトのイベントにハンドラをプログラマブルに割り当てることができます。

+0

これが解決策です。ありがとうたくさんのガンビット! – Avatar

関連する問題