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
[72797] Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다.
newhuni [] 4183 읽음    2015-06-23 10:55
안녕하세요.
클라이언트에서 서버의 데이타 440KB를 1초에 한번씩 읽어와야 합니다.
질문1) 어떻게 하면 가장 안정적으로 통신할 수 있을가요??

제가 생각해서 구현한 방법은 아래와 같습니다.

첫번째 구현한 방법은
클라이언트에서 요청신호 보내면 서버에서 그냥 구조체 배열 형태로 440KB를 통째로 보내는 방법을 사용했습니다.
기존에도 단순한 통신은 이렇게 했었습니다. 다만. 그때는 용량이 길어야 몇십 바이트였죠.
그런데.. 440KB를 보내니. 1:1에서는 괜찮은데.. 클라이언트가 2개 이상만 되도 데이타가 꼬이 더라구요.
용량이 커서 그런것 같아.. 방법을 바꾸어 보았습니다.

두번째 구현한 방법은
구조체를 TMemoryStream형태로 하여 송/수신 하도록 수정하였습니다.
스트림 형태로 보내면 용량이 커도 상관없지 않을까 생각했습니다.
그런데... 클라이언트에서 요청신호 보내고 서버 응답해온 수신된 데이타를 보면 시작부분에 꼭 4바이트가 이상한 데이타가
포함되어 있습니다. 그래서 Wireshark로 분석해 보니 서버에서 4바이트 보내는 것으로 나타났습니다.

소스에서는 보내는 부분이 없는데.... 왜 그런지 모르겠습니다.
그냥 구조체를 보내면 상관없는데.. 이 부분을 MemoryStream형태로 보내면 꼭 나타납니다.

질문2) 코드에서 잘못된 부분이 있을까요???

void __fastcall TForm1::SendTx2(TIdContext *AContext, int start, int count)
{
    UnicodeString Msg;
    unsigned char header[6];

    header[0] = 0x02; // HEAD
    header[1] = 0x02;
    header[2] = (start >> 8) & 0xff;
    header[3] = start & 0xff;
    header[4] = (count >> 8) & 0xff;
    header[5] = count & 0xff;

    int tx_pos=0;
    unsigned char tx_packet[261];
    memset(tx_packet, 0x0, sizeof(tx_packet));

    for(int i=0;i<count;i++){ // DATA
        for(int j=0;j<26;j++){
            tx_packet[tx_pos++] = (i % 26) + 0x41;
        }
    }
    tx_packet[tx_pos++] = 0x03; // TAIL

    TMemoryStream *pSendStream = new TMemoryStream();
    pSendStream->Clear();
    pSendStream->Position = 0;

    pSendStream->WriteBuffer(&header, 6);
    pSendStream->WriteBuffer(&tx_packet, tx_pos);

    try
    {
        pSendStream->Position = 0;

        Msg.sprintf(L"Send Ok.. %d ~ %d", start, start + count);
        RichEdit1->Lines->Add(Msg);
        AContext->Connection->IOHandler->Write(pSendStream, 6+tx_pos, true);
    }catch(...){}

    delete pSendStream;
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
72797 Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다. newhuni 4183 2015/06/23
72798     Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다. kylix 4216 2015/06/23
72799         Re:Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다. newhuni 4279 2015/06/23
72800             Re:Re:Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다. kylix 4070 2015/06/23
72801                 Re:Re:Re:Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다. newhuni 4155 2015/06/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.