Async 소켓 통신을 하는데 실제 패킷이 다 도착했는지 여부를 확인하는 로직이 궁금합니다.
처음에 기본 Read 방식으로 구현해 봤습니다.
procedure TmySock.ReadMsg(Sender: TObject; Socket: TCustomWinSocket);
Var n, nSize, BufSize, pos : Integer;
begin
n := Socket.ReceiveLength;
if n > 0 then
begin
nSize := Socket.ReceiveBuf( FBuf, n );
AddQue( FBuf );
if FQueCount > 0 then
begin
// 큐를 읽고 있는 동안은 Message 를 날리지 않는다.
if not FQueFlag then
begin
PostMessage( FHandle, WM_MYMSG, 0, 0 );
FQueFlag := True;
End;
End;
end;
end;
위의 ReadMsg 로 읽었을때 패킷이 2번에 걸쳐 왔을때 처리가 제대로 안되는듯 싶어 ,
4000 byte 가 3000, 1000 으로 쪼개져 들어올때 뒤의 1000 바이트를 제대로 처리가 안되는듯
합니다.
그래서 위의 소스를 아래와 같은 구조로 변경해 봤는데, 무엇인가 제대로 처리가 안된다는
느낌을 받았습니다.
procedure TmySock.ReadMsg(Sender: TObject; Socket: TCustomWinSocket);
Var n, pos, nSize, BufSize : Integer;
nTime : Cardinal;
begin
FIdle := False;
FRcvMsg := '';
n := 0;
nTime := GetTickCount;
While ( nTime + 50000 > GetTickCount ) and (n = 0) do n := Socket.ReceiveLength;
While (n > 0) do
begin
BufSize := 4096;
if BufSize > n then BufSize := n;
FillChar( LBuf, SizeOf(LBuf), #0 ); // 버퍼초기화
nSize := Socket.ReceiveBuf(LBuf,BufSize);
FRcvMsg := FRcvMsg + String(LBuf);
n := n - BufSize;
// 이부분에 헛짓을 하면 socket 에 계속 데이타가 들어오는
// 시간을 제공함으로 계속 여기서 루프가 돌수 있다.
if (n = 0) then n := Socket.ReceiveLength;
end;
AddQue( FRcvMsg )
if FQueCount > 0 then
begin
// 큐를 읽고 있는 동안은 Message 를 날리지 않는다.
if not FQueFlag then
begin
PostMessage( FHandle, WM_MYMSG, 0, 0 );
FQueFlag := True;
End;
End;
FIdle := True;
end;
패킷이 여러번 걸쳐 소켓으로 수신될때의 처리 방법에 대해, 고수님들의 도움 바랍니다.