|
음...
개인적으로 network는 잘 모르지만...
장비에서 serial 로 수신해서 중간에 tcp로 convert해서 전송해 준다고 했는데...
그 부분에 문제가 있지 않나 하는 생각이 드네요
16kbyte정도면 대 용량도 아니구..
tcp가 패킷이 깨어진다는 얘기도 별루 못들어 봤구..
제 생각엔 serial통신쪽에서 data가 문제가 있지 않을까 합니다.
그리고 님께서 사용하신 component가 TClieltSocket인것 같은데..
대부의 socket컴포넌트는 내부적으로 송수신을 thread를 이용해서 처리하고 있습니다.
님께서 따로 해주지 않아도 이미 그렇게 만들어져 있는것입니다.
그럼..
사루짱 님이 쓰신 글 :
: 안녕하십니까.. 씨빌더 한지 얼마 안된 완전 초짜가 답답해서 이렇게 질문을 드립니다. ㅜㅜ
:
: 우선 장비에서 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);
:
: //데이터 처리부분
: ....
: ...
:
: }
|