서버에서 보낸데이타를 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;
처
네트웍 프로그래밍에 대해서 잘은 모르지만
그럴 수 있습니다.
서버가 보낸 블럭이 그대로 오는 것이 아니기 때문입니다.
서버쪽에서만 봐도 코드상으로 블럭을 지정했다고 해서
실제 물리적인 패킷이 그 크기대로 간다는 보장은 없습니다.
중계되는 네트웍 경로에 따라서도 얼마든지 분할될 수 있는 것으로 압니다.
따라서 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;
> 처
>