Я использую FireMonkey в Delphi 10.1 Berlin для разработки мобильного клиентского приложения Android и использую VCL в Delphi 10.1 Berlin для разработки серверного приложения Windows.
В мобильном приложении я использую TIdTCPClient
для отправки следующей записи:
PSampleReq = ^TSampleReq ;
TSampleReq = packed record
Value1: array [0..10] of Char;
Value2: array [0..59] of Char;
Value3: array [0..40] of Char;
Value4: Int64;
Value5: array [0..9] of Char;
Value6: array [0..9] of Char;
Value7: Integer;
end;
Я заполнил пакет данными и отправляю пакет, используя следующий код:
FIdTCPClient.IOHandler.Write(RawToBytes(TSampleReq,SizeOf(TSampleReq)));
При чтении данных в приложении "Сервер" я не могу прочитать поля Value5
, Value6
и Value7
. Ниже приведен код, который считывает данные:
Move(tyTIDBytes[0], SampleReq, SizeOf(TSampleReq));
Для получения данных, которые отправляются из клиентского сокета, я использовал TIDTcpServer и обработал приведенный ниже код в методе Execute:
TServerRecord = packed record
PointerMessage : TIndyBytes;
ClientSocket : TIdTCPConnection;
end;
Var
ReceivedIDBytes: TServerRecord;
begin
if not AContext.Connection.IOHandler.InputBufferIsEmpty then
begin
AContext.Connection.IOHandler.InputBuffer.ExtractToBytes(ReceivedIDBytes.PointerMessage.tyTIDBytes) ;
ReceivedIDBytes.ClientSocket := AContext.Connection;
MessageProcessorThread.ProcessMessageQueue.Enqueue(ReceivedIDBytes);
end;
После этого я обрабатываю данные из очереди и метод обработки, который я упомянул ниже:
var
InputRec: TServerRecord;
begin
InputRec := DBWorkerThread.DBWorkerQueue.Dequeue;
MessageHeaderPtr := @InputRec.PointerMessage.tyTIDBytes[0];
iHMMessageCode := StrToIntDef( Trim(MessageHeaderPtr^.MessageCode), UNKNOWN_MESSAGE_CODE);
case iHMMessageCode of
1001:
begin
Move(InputRec.PointerMessage.tyTIDBytes[0], SampleReq, SizeOf(TSampleReq));
end;
end;
И в этом я не могу прочитать поля Value5, Value6 и Value7.
С помощью приведенной ниже ссылки я нашел оптимизированную технику и то, как я могу правильно обрабатывать пакеты, не пропуская ни одного пакета. Пожалуйста, помогите мне решить эту проблему.
sizeof(TSampleReq)
составляет ровно 276 байт в обоих приложениях? Вы не показали свой фактический код чтения, заполняющийtyTIDBytes
, до того, как вы вызвали для негоMove()
. Код должен быть примерно таким:var tyTIDBytes: TIdBytes; ... AContext.Connection.IOHandler.ReadBytes(tyTIDBytes, SizeOf(TSampleReq), False);
И к вашему сведению, у Инди есть функцияBytesToRaw()
в качестве дополнения кRawToBytes()
:BytesToRaw(tyTIDBytes, SampleReq, SizeOf(TSampleReq));
- person Remy Lebeau   schedule 09.05.2017tyTIDBytes := RawToBytes(SampleReq, SizeOf(TSampleReq); FIdTCPClient.IOHandler.Write(Int32(Length(tyTIDBytes))); FIdTCPClient.IOHandler.Write(tyTIDBytes);
...AContext.Connection.IOHandler.ReadBytes(tyTIDBytes, AContext.Connection.IOHandler.ReadInt32, False); BytesToRaw(tyTIDBytes, SampleReq, SizeOf(TSampleReq));
- person Remy Lebeau   schedule 09.05.2017sizeof(TSampleReq)
составляет ровно 276 байт в обоих приложениях?. - person Remy Lebeau   schedule 22.05.2017ExtractToBytes()
неправильно, и это корень вашей проблемы. Я отправил ответ сейчас. - person Remy Lebeau   schedule 22.05.2017