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
[63413] Re:인디소켓으로 리시브하는데 용량이 큰 데이터가 들어올때...
Lyn [tohnokanna] 1357 읽음    2011-01-05 13:43
원래 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번째까지 다 뭉텅이로해서
: 들어오니까 이건뭐 어떻게 해야할지모르겠는거에요
:
: 제가 잘못받고있는건지 이거 어떻게해야하나요

+ -

관련 글 리스트
63411 인디소켓으로 리시브하는데 용량이 큰 데이터가 들어올때... 알론소 1421 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.