Q&A

  • 소켓에서 onRead이벤트 발생에 대해..
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버퍼에
또 집어 넣으니 전에있던 자료들은 지워지는 꼴이잖아요.

아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
머리아파 -_-;
책없이 공부할려니 딥따 힘드네...

멋있는 답변 바랍니다
2  COMMENTS
  • Profile
    최호준 2002.01.10 19:55
    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;
        


    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를

    해야 하실겁니다.

    마지막으루 제가

    궁금한게 있는데 파일전송 시작과 종단을 어떻게 판단 하실려고 하세욤.




  • Profile
    최성환 2002.01.11 00:52

    로컬측에서 네트웍상태에 따라 쪼개저서 받는 단위가 달라진다고
    하셨는데요. 그러면 매 전송시 쪼개지는 크기를 어디서 담당하는
    것입니까? 서버측에서 계산해서 보내는 겁니까? 아니면
    그냥 아주 마음데로 보내는 것입니까(-.-) 궁금하네요 ^^

    그리고 Nonblocking 소켓 모드인가? 으미.. 무슨 말인지 잘 모르겠네요.

    만약, 서버측에서 100바이트를 보냈는데 로컬측에서 네트웍불량으로
    인한 손실이 발생한다면, 그래서 10바이트만 받았다면..
    큰 문제같은데요. 어디서 듣기로는 자신만의 패킷을 만들어서
    로컬측에서 체킹하고 뭐 그러던거 같은데요. 어떻게 하는지 모르겠네요T_T


    이궁.. 파일전송 시작은 그냥 onRead발생시이고
    종단은 으음... OnDisconnect아닌가용? 좀 알려주세요!!!

    p.s: 소켓 잘하면 재미있을텐데... 답변 감사합니다!