Q&A

  • 기본소켓에서 패킷이 다 왔는지 확인 하는 방법?

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;



패킷이 여러번 걸쳐 소켓으로 수신될때의 처리 방법에 대해,  고수님들의 도움 바랍니다. 






0  COMMENTS