procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
ln : Integer;
Data : Array[1..4000] of Byte;
begin
ln := Socket.ReceiveLength;
Socket.ReceiveBuf(Data, ln);
end;
파일 받는 프로그램 제작중인데
위에처럼 Data라는 배열에 상대방 파일을 받거든요?
근데 이해가 안되는게 있는데
우선 내가 상대방에게서 4000바이트짜리 파일을 받는다면
상대방이 100바이트씩 파일을 보낸다고 가정할때
onRead이벤트는 파일을 4000바이트 다 받고나서 발생합니까?
아니면 100바이트 받을때마다 발생합니까?
그리고 결론적으로 위의 Data라는 버퍼에 받고자 하는 4000바이트 파일이
저장되는 겁니까?
만약 onRead이벤트가 100바이트씩 받을때 발생한다면 Data버퍼에는
100바이트가 있을것이고 또 추가로 100바이트 받았을땐 Data버퍼에
또 집어 넣으니 전에있던 자료들은 지워지는 꼴이잖아요.
아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
머리아파 -_-;
책없이 공부할려니 딥따 힘드네...
멋있는 답변 바랍니다
Socket: TCustomWinSocket);
var
ln : Integer;
Data : Array[1..4000] of Byte;
begin
ln := Socket.ReceiveLength;
Socket.ReceiveBuf(Data, ln);
end;
Remote측에서 4000바이트짜리 파일을 보내는데
100바이트식 보낸다고 가정하였을때
일단.Local측
Local측에서 100바이트씩 받는다는 보장은 없습니다.
네트웍이 느릴경우 더작은단위로 쪼개져서 받아집니다.
빠를경우는 100바이트 이상 뭉쳐서 받아지겠죠.
제가 지금까지 넌블럭킹 모드에서
테스트 한바로는 100바이트씩 빠르게 전송한다고 하더라도.
100바이트 이상 뭉쳐서 받는경우는 아직은 없더군요.
라고 말씀하셨는데 .. 멤버변수루 파일디스크립터나 파일스트림을
선언하셔서. 데이터를 받을때마다 저장하세요 ㅡㅡ.
로컬변수루 한번에 다 받을려고 하시면 안돼구요.
//fStream이라구 TFileStream이 선언되어있다고 가정하고.
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
rLen:Integer;
Data : Array[0..4000] of Byte;
begin
while Socket.ReceiveLength > 0 do begin
rLen := Socket.ReceiveBuf(Data, 4000);
fStream.WriteBuffer(Data ,rLen)
end;
end;
위와 같이 사용하시면 됩니다 ㅡㅡ.
넌블럭킹 끼리 파일전송을 하실려면 handshake를
해야 하실겁니다.
마지막으루 제가
궁금한게 있는데 파일전송 시작과 종단을 어떻게 판단 하실려고 하세욤.