tidtcpserver لا قراءة البيانات من المقبس في بعض الأحيان
-
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، لذلك يبدو عام واحد مثل الذهاب.
آسف على الإجابة على سؤالي الخاص ولكن قد يكون هيبئا لشخص ما ... ربما.