|
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번째까지 다 뭉텅이로해서
들어오니까 이건뭐 어떻게 해야할지모르겠는거에요
제가 잘못받고있는건지 이거 어떻게해야하나요
|