|
안녕하십니까.. 씨빌더 한지 얼마 안된 완전 초짜가 답답해서 이렇게 질문을 드립니다. ㅜㅜ
우선 장비에서 16Kbyte정도의 사진파일을 전송해주는데요. 이게 중간에 올라오다가 패킷이 잘리는것 같습니다.
원래 장비는 serial통신을 하는데 중간에 컨버팅 되어서 TCP통신으로 바껴서 올라오는 패킷입니다.
장비에서는 1Kbyte단위로 잘라서 보낸다고 함(<-이건 확인을 할 방법이 없어서 ㅜㅜ)
검색을 해보니 TCP통신 특성상 패킷크기가 네트워크 상황에 따라서 다르게 날라와서 그걸 안정적으로 받기 위해서
스레드를 사용해서 받아야 한다고 들었는데요 (<-이것도 맞는지 잘 모르겠네요 ㅜㅜ)
8Kbyte이하의 메세지 같은 경우는 이상 없이 처리가 되는데요
큰용량의 파일이 올라오면 CRC체크까지 가지도 않는것으로 봐서
중간에 대기를 타는 거 같기도 하거든요.
그리고
OnClientRead 함수가 데이터 처리중에 몇번 호출되는걸로 봐서 TCP에서 기본적으로 패킷 길이가 길면 스레드를 생성해서 처리를 해준다고 들었는데요 (<- 이것도 그냥 검색하다 본거라서 확실히 모르겠네요.)
너무 개념적으로도 모르는게 많아서 이것저것 궁금한거 다적다 보니 말이 이상해졌는데요.
핵심내용만 적으면요..
- TCP통신을 할때 대용량의 패킷을 안정적으로 받으려면 어떤식으로 하는것이 좋은지 알려주셨으면 합니다.
- 밑에 소스에서 통신상에 어떤 문제가 있는지 좀 지적 해주셨어면 합니다.
고수님들의 관심어린 답변 부탁드립니다 ㅜㅜ
void __fastcall TfrmMain::OnClientRead(TObject *Sender, //<-처음 패킷을 받는 함수같은데요.
TCustomWinSocket *Socket)
{
IsMemory(Socket);
IsErrorMsg(ReadClientData(Socket),"ReadClientData");
}
Error_Code TfrmMain::ReadClientData(TCustomWinSocket *pClientSocket)
{
IsSocketEx(pClientSocket);
uchar* tmpData;
uint16 nDataLen = 0;
uint16 nIndex = 0;
IsErrorEx((Error_Code)FindSocketIdx(pClientSocket, &nIndex));
nDataLen = pClientSocket->ReceiveLength();
tmpData = (unsigned char *)malloc(nDataLen * 2 + 10);
pClientSocket->ReceiveBuf(tmpData, nDataLen);
//데이터 처리부분
....
...
}
|