tidtcpserver لا قراءة البيانات من المقبس في بعض الأحيان

StackOverflow https://stackoverflow.com/questions/1507136

  •  19-09-2019
  •  | 
  •  

سؤال

لدي التعليمات البرمجية التالية في Onexecute من TidTCPServer (Delphi 2009 و Indy 10 التي جاءت مع التثبيت) مماثلة للغاية للأمثلة الأخرى على هذا الموقع؛

   Socket := AContext.Connection.Socket;
    if Socket.CheckForDataOnSource(10) then
    begin
      if not Socket.InputBufferIsEmpty then
      begin
        Socket.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);

        SetLength(Buffer, Length(RawBytes));
        Move(RawBytes[0], Buffer[1], Length(RawBytes));

        // Do stuff with data here...
      end;
    end;
    AContext.Connection.CheckForGracefulDisconnect;

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

أيضا كملاحظة جانبية، لاحظت في التعليمات البرمجية من أجل Indy حول المكان الذي يحصل فيه بعض الأشخاص على Acontext.connection.iohandler بدلا من Acontext.connection.socket وتقوم بنفس الأشياء مثل الكود أعلاه، ما هو "الأيمن" ليستخدم.

شكرا

بروس

هل كانت مفيدة؟

المحلول

يجب أن يكون الرمز أكثر مثل هذا:

var
  IO: TIdIOHandler.
  Buffer: RawByteString;
begin
  IO := AContext.Connection.IOHandler;

  if IO.InputBufferIsEmpty then
  begin
    IO.CheckForDataOnSource(10);
    if IO.InputBufferIsEmpty then Exit;
  end;

  IO.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);     
  // or: IO.ReadBytes(RawBytes, -1, False);

  SetLength(Buffer, Length(RawBytes));
  BytesToRaw(RawBytes, Buffer[1], Length(RawBytes));
  // Do stuff with Buffer here...
end;

نصائح أخرى

يبدو أن الكود الخاص بك يجب أن تبدو مثل هذا؛

Socket := AContext.Connection.Socket;
Socket.CheckForDataOnSource(10);
if not Socket.InputBufferIsEmpty then
begin
  Socket.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);

  SetLength(Buffer, Length(RawBytes));
  Move(RawBytes[0], Buffer[1], Length(RawBytes));

  // Do stuff with data here...
end;
AContext.Connection.CheckForGracefulDisconnect;

لا يهم ما الذي تمسك به Iohandler، لذلك يبدو عام واحد مثل الذهاب.

آسف على الإجابة على سؤالي الخاص ولكن قد يكون هيبئا لشخص ما ... ربما.

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