C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[63411] 인디소켓으로 리시브하는데 용량이 큰 데이터가 들어올때...
알론소 [smire4454] 1420 읽음    2011-01-05 12:15
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번째까지 다 뭉텅이로해서
들어오니까 이건뭐 어떻게 해야할지모르겠는거에요

제가 잘못받고있는건지 이거 어떻게해야하나요

+ -

관련 글 리스트
63411 인디소켓으로 리시브하는데 용량이 큰 데이터가 들어올때... 알론소 1420 2011/01/05
63413     Re:인디소켓으로 리시브하는데 용량이 큰 데이터가 들어올때... Lyn 1357 2011/01/05
63424         Re:Re:인디소켓으로 리시브하는데 용량이 큰 데이터가 들어올때... 알론소 1698 2011/01/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.