|
답변 감사합니다.
아무래도 더 생각해봐야겠어요..
길이정보는 없어도 1KB단위로 나눠서 다보내준다했으니
1KB를 몇번나눴는지 나눈게 몇번짼지 알수있으니까 이거랑 또
아마 되는대로 반응하는대로 다 쌓아두고 처리하는게 나을꺼같아요
Lyn 님이 쓰신 글 :
: 원래 TCP엔 패킷의 경계라는게 존재하지 않습니다... 그러니까 한번 받을때 얼마가 들어올진 아무도 모르죠 =_=a
:
: 머 기본적인방법은
:
: 1. 헤더에 길이정보가 있는경우
:
: 헤더길이만큼 Read -> 헤더에 적힌 길이만큼 다시 Read -> 반복
:
: 2. 헤더에 길이정보가 없는경우
:
: 일단 되는데로 받아서 버퍼에 쌓아 두고 다시 분석
:
: 알론소 님이 쓰신 글 :
: : void __fastcall CVdsObject::Execute()
: : {
: : while ( !Terminated )
: : {
: : if ( IdTCPClient->Connected() )
: : Receive_Data();
: :
: : ::Sleep(10);
: : } // end of while
: : }
: :
: : CVdsObject객체 안에 스레드를 생성해서
: : Receive_Data()를 호출하는 형식인데요
: :
: : Receive_Data() 함수안에는
: :
: : iStackSize = IdTCPClient->ReadFromStack();
: : if(iStackSize > 0)
: : {
: : iStackBufSize = IdTCPClient->InputBuffer->Size;
: : IdTCPClient->ReadBuffer(cRecvBuf, iStackBufSize);
: : memcpy(Buf, cRecvBuf, iStackBufSize);
: : }
: :
: :
: : 이런식으로해서 receive받아서 변수에 담는 식으로
: : 했었는데요
: :
: : 만약에 receive가 한번오면은 상관이없는데
: : 간혹 요청을했는데 여러번 ReadFromStack()함수가
: : 반응할때 있잖아요
: : 보니까 1KB이상인게 넘어오면
: : 예를들어 약16KB 데이터가 온다고하면
: : 세번반응해서 받을때도있고 두번 뭐 네번아님 16번
: : 들어오더라구요
: :
: :
: : 근데 저 데이터를 받아도 앞에 OPCODE같은것도 구별해야하고
: : 그데이터가 정확한지 검증해야하잖아요 CRC체크를한다던지
: : 그리고 그데이터로 처리를하는등 이런걸해야하잖아요
: :
: : 물론 여러번 넘어오는데이터들 다보면요
: : 앞에 DLE STX 뒤에 DLE ETX다 붙여있구요
: :
: : 보니까 세번나눠서 오는경우있길래
: : 보니깐요
: : 첫번째는
: : 그냥 1045byte넘어와서 나중에 다 헤더부분이나뭐 뒤에부분다잘라보니까
: : 1023byte 만남더라구요
: : 그리고
: : 두번째 보니까 한 8000byte넘게들어왔는데
: : 그안에 DLE STX, DLE ETX CRC이런거 다 달려서
: : 몇개 뭉텅이로 왔더라구요
: :
: : 그래서 암튼 처리를 해야하는데
: : 아이걸어떻게할까..바로 들어오는대로 바로
: : 처리를 해버리자라고생각을했는데
: : 안되는거에요
: :
: : 왜안댈까 보고 생각해보니까
: :
: : 처리를 하다가 갑자기 ReadFromStack()가 반응을
: : 해버리는거에요
: : 그러면서 이때껏 처리하던게 순간 날라갔다고해야하나
: : 처리하던게 그냥 멈추는것도아니고 그냥 ReadFromStack()로
: : 가더니 또 받더라구요 그래서 또 처리하다가
: : 또 ReadFromStack()안에 데이터 들어왔다고 이렇게 되버리는거에요
: :
: : 그래서 이걸 어떻게 처리해야할지모르겠어요
: :
: : 차라리 다받고 처리를하자
: : 라고 생각을해도
: : 도무지 제가받는입장에서 ReadFromStack()함수가 얼마나 얼만큼
: : 반응을 하는지 모르고 용량도 어느정도 들어오는지모르고
: : 그냥 받는거밖에 모르는데 어떻게해야할지모르겠고
: :
: : 그래서 데이터 줄때 1KB단위로 나눠서 구성했다면
: : 거기 패킷안에다가
: : 예를들어서 전체 16개이고 이게 첫번쨰다 두번째다 16번째다
: : 이렇게 구별할수있게 2byte 추가시켜달라했거든요
: : 근데 이걸 추가해도
: : 디버깅해서 보니까
: : 약16KB 이게 16번 딱딱 오는것도아니라
: : 세번반응해서 들어왔었는데 보니까
: : 3번째부터 7번째까지 다 뭉텅이로해서
: : 들어오니까 이건뭐 어떻게 해야할지모르겠는거에요
: :
: : 제가 잘못받고있는건지 이거 어떻게해야하나요
|