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
[72798] Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다.
kylix [] 4216 읽음    2015-06-23 12:56
Indy에서 Stream을 이용해서 보낼때는 항상 보낼 데이터의 크기(두번재파라매터)를 먼저 전송합니다. 그래야지 받을 때 보낸 크기만큼 받을 수 있으니까요.

보낼 용량이 크다고 해서 클라이언트끼리 데이터가 꼬일 이유는 없습니다. 뭔가 프로그램 구조상의 문제일듯 하네요..

newhuni 님이 쓰신 글 :
: 안녕하세요.
: 클라이언트에서 서버의 데이타 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 4184 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.