سؤال

أنا أستخدم TidTCPCMDServer لمعالجة جميع الاتصالات مع تطبيقات العميل. أرغب في تسجيل الخادم الخاص بي جميع أنواع الأشياء بما في ذلك حركة مرور الشبكة. هل هناك أي طريقة سهلة أو ذكية لمعرفة مقدار البايتات التي تلقى tcpcmdserver بالفعل وإرسالها؟ لا أستطيع إلا أن أفكر في كود مثل

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;

وفي طريقة OnConnect من TidTCPCMDServer:

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

يعمل بشكل رائع، فقط نوع الحل الذي كنت أبحث عنه. شكرا مرة أخرى على إجاباتك.

راجع للشغل: كيف يمكنني استخدام (في) تسجيل الدخول في مشاركاتي؟ أحصل دائما على اقتباس كتلة عندما أحاول كتابة ذلك ...

نصائح أخرى

انظر إلى فصول اعتراض Indy. يجب أن تكون قادرا على إنشاء فئة اعتراض مخصصة تتجاوز أساليب تلقي () وإرسال ()، بالإضافة إلى استدعاء طرق الفئة الأساسية تنفذ حساب المرور الخاص بك. هناك بالفعل فصول اعتراضات للقيام بالتسجيل، وسوف توصل فئة مخصصة بنفس الطريقة.

وثائق tidconnectionIntercept. يجب أن تكون نقطة انطلاق جيدة. هناك أيضا مثال بسيط جدا هنا حول كيفية إنشاء وتوصيل اعتراض في وقت التشغيل.

لف 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 وفضح الأساليب والخصائص المطلوبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top