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
[72799] Re:Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다.
newhuni [] 4279 읽음    2015-06-23 17:56
말씀해주신거 확인해 보니 사이즈가 맞더라구요. 감사합니다.
그럼 MemoryStream을 사용하지 않고 그냥 한번에 440kb보내도 상관 없어야 하는 건가요?
이 부분은 다시 테스트 해 보겠습니다.

그리고 한가지만 더 여쭤볼께요... ^^;;
서버 <-> 클라이언트 통신중에 서버를 강제 종료시켜 버리면 서버와 클라이언트 모두 오류가 발생합니다.
아무래도 클라이언트에서 서버측의 데이타를 기다리고 있는데 갑자기 연결이 끊어져서 그런것 같습니다.
이럴때는 어떻게 예외처리를 해야 하나요???

try문을 사용해도 처리가 안되는것 같습니다.

kylix 님이 쓰신 글 :
: 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 4217 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.