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
[72800] Re:Re:Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다.
kylix [] 4069 읽음    2015-06-23 18:40
클라이언트와 서버간의 프로토콜만 맞으면 어떠한 방식으로 보내든 상관이 없습니다.

예외처리는 try~catch구문을 이용하시면 됩니다.

예외처리가 않된다는 것은 아마도 IDE에서 실행해서 그럴겁니다.
IDE에서 실행시 디버깅을 위해서 try~catch문으로 숨긴다고 하더라도 예외를 표시하도록 되어 있습니다. 프로그램을 탐색기에서 직접 실행시키시거나, IDE에서 실행시에는 IDE의 옵션에서 해당 예외를 처리하지 않도록 옵션을 끄시면 됩니다.

newhuni 님이 쓰신 글 :
: 말씀해주신거 확인해 보니 사이즈가 맞더라구요. 감사합니다.
: 그럼 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 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 4069 2015/06/23
72801                 Re:Re:Re:Re:Indy를 이용한 구조체 데이타 전송 방법 조언 구합니다. newhuni 4155 2015/06/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.