procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var aStream : TMemoryStream;
InBuf : TPacket;
TotLen : LongWord;
RcvData : PChar;
begin
Try
aStream := TMemoryStream.Create;
AThread.Connection.ReadStream(aStream, -1, false);
aStream.Position := 0;
aStream.ReadBuffer(InBuf, SizeOf(InBuf.MC) + SizeOf(InBuf.PV) + SizeOf(InBuf.DL));
SetLength(InBuf.DATA, InBuf.DL - SizeOf(InBuf.CS));
AStream.ReadBuffer(InBuf.DATA[0], InBuf.DL - SizeOf(InBuf.CS));
AStream.ReadBuffer(InBuf.CS, SizeOf(InBuf.CS));
GetMem(RcvData, InBuf.DL - SizeOf(InBuf.CS));
try
CopyMemory(RcvData, @InBuf.Data[0], InBuf.DL - SizeOf(InBuf.CS));
Memo1.Lines.Add('받음 : MC : ' + InBuf.MC);
Memo1.Lines.Add(' PV : ' + InBuf.PV);
Memo1.Lines.Add(' Data Length : ' + IntToStr(InBuf.DL));
// Memo1.Lines.Add(' 송신데이터 : ' + StrPas(RcvData));
Memo1.Lines.Add(' 송신데이터 : ' + Copy(StrPas(RcvData), 1, InBuf.DL - SizeOf(InBuf.CS)));
Memo1.Lines.Add(' Check Sum : ' + IntToStr(InBuf.CS));
finally
FreeMem(RcvData, InBuf.DL - SizeOf(InBuf.CS));
end;
Finally
aStream.Free;
end;
end;
최용일님 조언으로 문제는 다 해결됐습니다. 너무 감사드리고요,,
서버에서 데이터를 Memo에 뿌려보는데... 송신데이터 부분이 이상하네요.
저렇게 Copy문을 안쓰면 문자열 뒤에 이상한 쓰레기 값이 하나 나옵니다. 똑같은 데이터를 계속 보내면
어쩔땐 안나오고 어쩔땐 나오고...대부분 나옵니다.
제가 동적배열값의 내용을 스트링으로 변환하는 방법이 잘못된건가요?
메모리 할당할 때 널문자를 위해서 (문자열의 크기 + 1)을 해주세요.
널 종료 문자열이기 때문에 데이터 중간에 널(#0)값이 들어가 있으면 그 이후로는 화면에 안보입니다.
문자열 중간에 널문자(#0)가 포함되어야 한다면 PChar형대신에 string형을 쓰세요.
GetMem(RcvData, InBuf.DL - SizeOf(InBuf.CS) + 1);
FillChar(RcvData^, InBuf.DL - SizeOf(InBuf.CS) + 1, 0); // Fill data with zero for null-terminated string
try
CopyMemory(RcvData, @InBuf.Data[0], InBuf.DL - SizeOf(InBuf.CS));
......
finally
FreeMem(RcvData, InBuf.DL - SizeOf(InBuf.CS) + 1);
end;