|
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;
: }
: //---------------------------------------------------------------------------
|