Q&A

  • clientsocket.onread
서버에서 보낸데이타를 onread이벤트에서 읽습니다.

서버에서는 단한번 데이타를 보냈다는데

onread이벤트가 2번 발생했습니다.

client type : ctnonblocking이구요.

이럴수있나요?



아래에는 소스부분입니다.

procedure TFi5010.ClientSocket1Read(Sender: TObject;

Socket: TCustomWinSocket);

var

RcvBuffer: array[0..4449] of Char;



begin

RcvBuffer := '';





Socket.ReceiveBuf(RcvBuffer, 4500);

Receivedata :=Receivedata + RcvBuffer;

showmessage(inttostr(length(receivedata)));

showmessage('a');



// if RcvBuffer[0] = '' then

SaveData;





1  COMMENTS
  • Profile
    김일영 2000.11.13 23:56
    안녕하세요.

    네트웍 프로그래밍에 대해서 잘은 모르지만

    그럴 수 있습니다.

    서버가 보낸 블럭이 그대로 오는 것이 아니기 때문입니다.

    서버쪽에서만 봐도 코드상으로 블럭을 지정했다고 해서

    실제 물리적인 패킷이 그 크기대로 간다는 보장은 없습니다.

    중계되는 네트웍 경로에 따라서도 얼마든지 분할될 수 있는 것으로 압니다.

    따라서 OnRead 이벤트의 횟수를 가정하셔서는 안되고

    데이터의 끝에 도달할 때까지 계속해서 OnRead에서 읽어서 축척한다는

    개념으로 작성하셔야 합니다.

    수고하세요.



    박병희 wrote:

    > 서버에서 보낸데이타를 onread이벤트에서 읽습니다.

    > 서버에서는 단한번 데이타를 보냈다는데

    > onread이벤트가 2번 발생했습니다.

    > client type : ctnonblocking이구요.

    > 이럴수있나요?

    >

    > 아래에는 소스부분입니다.

    > procedure TFi5010.ClientSocket1Read(Sender: TObject;

    > Socket: TCustomWinSocket);

    > var

    > RcvBuffer: array[0..4449] of Char;

    >

    > begin

    > RcvBuffer := '';

    >

    >

    > Socket.ReceiveBuf(RcvBuffer, 4500);

    > Receivedata :=Receivedata + RcvBuffer;

    > showmessage(inttostr(length(receivedata)));

    > showmessage('a');

    >

    > // if RcvBuffer[0] = '' then

    > SaveData;

    > 처

    >