|
클라이언트와 서버간의 프로토콜만 맞으면 어떠한 방식으로 보내든 상관이 없습니다.
예외처리는 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;
: : : }
: : : //---------------------------------------------------------------------------
|