|
안녕하세요.
클라이언트에서 서버의 데이타 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;
}
//---------------------------------------------------------------------------
|