서버(c++) 와 클라이언트(델파이 5.0)간의 파일전송 프로그램을 만들고 있습니다.
파일내용과 전송정보를 가지는 레코드변수를 사용하구요..
레코드변수를 char 배열에 move()할 때, 이상한 값이 들어갑니다.
...
type
TPacketRec= record
cmd: array [0..2] of Char;
sn: integer;
size: integer;
endflag: char;
filecontent: array [1..1000] of char;
end;
var
Form1: TForm1;
Packet: TPacketRec;
FStream: TFileStream;
SendBuffer: array[1..1024] of Char;
....
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
With Packet do
begin
cmd1 := 'F';
cmd2 := 'T';
cmd3 := 'D';
sn := 1;
size := 1000;
endflag := '0';
FStream.ReadBuffer(FileContent, FileSize);
end;
Move(Packet, SendBuffer, SizeOf(Packet));
res := Socket.SendBuf(SendBuffer, 1024);
end;
-> debug를 한 결과, SendBuffer 변수에
'F','T','D',#0,#1,#0,#0,#0,#232,#3,#0,#0,'0',이하 파일내용...
값이 들어가는데, 'F','T','D' 다음에 #0 이 왜 들어가는건지 궁금합니다..
FTD 값을 3byte 길이로 보내야 하는데, 결과가 4byte가 되어버리네요.
그런데, 레코드변수에서 필드순서를 아래와 같이 바꾸면, #0 값이 안 들어가구요...
type
TPacketRec= record
cmd: array [0..2] of Char;
endflag: char; -> 순서바꾼 필드
sn: integer;
size: integer;
filecontent: array [1..1000] of char;
end;
혹, Integer가 4byte로 할당되는 것과 관련이 있는 건가요?
델파이에서는 빠른속도를 위하여 레코드형을 4바이트씩 옵티마이징합니다.
그러므로 님의 레코드에서는 cmd란 필드가 3바이트지만 실제 메모리에서는 4바이트를
차지하게 됩니다. 그래서 그런 쓰레기 값이 들어간거구요... 이런것을 피할려면 packed
형식으로 레코드를 바꾸어주시면 됩니다. 물론 옵티마이징을 꺼주셔두 되지만 packed를
사용하는것을 추천합니다.
type
TPacketRec= packed record
...
end;
^^ 항상 즐코하세요...
초보. wrote:
> 서버(c++) 와 클라이언트(델파이 5.0)간의 파일전송 프로그램을 만들고 있습니다.
> 파일내용과 전송정보를 가지는 레코드변수를 사용하구요..
> 레코드변수를 char 배열에 move()할 때, 이상한 값이 들어갑니다.
>
> ...
> type
> TPacketRec= record
> cmd: array [0..2] of Char;
> sn: integer;
> size: integer;
> endflag: char;
> filecontent: array [1..1000] of char;
> end;
> var
> Form1: TForm1;
> Packet: TPacketRec;
> FStream: TFileStream;
> SendBuffer: array[1..1024] of Char;
>
> ....
> procedure TForm1.ClientSocket1Connect(Sender: TObject;
> Socket: TCustomWinSocket);
> begin
> With Packet do
> begin
> cmd1 := 'F';
> cmd2 := 'T';
> cmd3 := 'D';
> sn := 1;
> size := 1000;
> endflag := '0';
> FStream.ReadBuffer(FileContent, FileSize);
> end;
>
> Move(Packet, SendBuffer, SizeOf(Packet));
> res := Socket.SendBuf(SendBuffer, 1024);
> end;
>
> -> debug를 한 결과, SendBuffer 변수에
> 'F','T','D',#0,#1,#0,#0,#0,#232,#3,#0,#0,'0',이하 파일내용...
> 값이 들어가는데, 'F','T','D' 다음에 #0 이 왜 들어가는건지 궁금합니다..
>
> FTD 값을 3byte 길이로 보내야 하는데, 결과가 4byte가 되어버리네요.
>
>
> 그런데, 레코드변수에서 필드순서를 아래와 같이 바꾸면, #0 값이 안 들어가구요...
> type
> TPacketRec= record
> cmd: array [0..2] of Char;
> endflag: char; -> 순서바꾼 필드
> sn: integer;
> size: integer;
> filecontent: array [1..1000] of char;
> end;
>
> 혹, Integer가 4byte로 할당되는 것과 관련이 있는 건가요?
>
>
>
>