C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[60497] Re:Re:Re:Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ
사루짱 [saru] 1602 읽음    2010-03-18 11:42
초보님 답변 감사드립니다.^^
우선 초보님 말대로 이더리얼로 패킷 캡쳐를 해본결과 패킷이 짧습니다.
정해진 max_recieve_cnt 보다 적게 올라오더군요.
패킷 길이가 정확히 어떻게 정해지는지는 확인해보고 있는 중이구요.

그런데 갑자기 의문이 생겨서 그러는 데요..
기초적인 질문 하나 드리겠습니다..
이더리얼에서 지금 제 컴퓨터에서 테스트하고 있는 프로그램에서  recieve를 다 못하고 대기를 만약에 하면요.
장비쪽에서 send가 끝까지 된 패킷을 캡쳐하는지 좀 물어보고 싶네요..

recieve버퍼에 데이터가 남아있으면 send쪽에서 send를 안하는것 아닌가요?? 그럼 이더리얼 패킷도 결국 잘린 패킷을 캡쳐되는게 아닌지 궁금하네여. (요건 갑자기 궁금해서 물어보는거예요.^^:;)

하지만 위에분들 답변을 보니 대기는 아닌것 같구요.
사진파일 크기가 왜 더 크게 잡히는지 부터 찾아보는게 먼저 일것 같네요..
이게 시리얼 통신으로 처리하는 소스를 TCP쪽에서 똑같이 데이터를 처리하다보니 이런 문제가 생기네요..ㅜㅜ
다른 사람이 만들어 논 소스에서 추가하는거라서 데이터 처리부분도 똑같다고 생각해서 이런듯

답변주셔서 감사하구요 행복한 하루되세요.^^


넘초보 님이 쓰신 글 :
: 이더리얼이나 wireshark 툴을 이용하여 패킷을 직접 보시면, 약속된 데이터가 오는지 확실하게 알수 있겠네요.
: 장성호님 말씀대로, 절~대 큰 패킷이 아니고, TCP 가 깨지는 경우도 거~의 없기 때문에, serial 쪽의 오류일것 같네요.
:
: Nibble 님이 쓰신 글 :
: : 원숭이님.
: :
: : 전송 자료의 크기가 크면 흔히 여러개의 패킷에 나뉘어서 읽어지게 됩니다.
: : 사진 이미지가 JPEG 처럼 가변 크기가 아니라 고정 크기라면, 정해진 크기만큼 읽도록 하시고,
: : 모자랄 경우엔 다음의 데이타 전송을 기다리게 만드시는게 나을 것 같구요.
: :
: : 그도 아니면, 읽은 데이타에서 헤더청크 등을 찾아서 합치거나 나누어주는 방법도 쓰실 수 있겠죠.
: : TSocket 보다는 IndySocket을 추천드립니다만,
: : 이미 구현한게 있으신듯 하니, 그냥 쓰셔도 될 것 같습니다.
: :
: : 전송패킷이나 이미지 포멧의 서두에 크기 정보가 들어 있으면 문제는 더 간단해지죠.
: :
: : 사루짱 님이 쓰신 글 :
: : : 장성호님 답변 감사드립니다.
: : :
: : : 우선 장비쪽에 패킷 덤프를 받아볼려구 요청은 했는데 장비업체쪽 기술지원이 어려운 상태라
: : : 확인도 못하고 답답하기만 하네요.
: : : 장성호 님 말대로
: : : 먼저 data를 확인하지 않는이상 실질적인 원인을 못찾는 상황이라
: : : 데이터는 제대로 올라온다고 가정하에 이렇게 무리한 작업을 진행하고 있네요. ㅜㅜ
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : 음...
: : : : 개인적으로  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);
: : : : :
: : : : :      //데이터 처리부분
: : : : :        ....
: : : : :        ...
: : : : :
: : : : : }

+ -

관련 글 리스트
60473 TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 사루짱 1718 2010/03/17
60491     Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 수문장 1873 2010/03/18
60494         Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 사루짱 1665 2010/03/18
60498             Re:Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 수문장 2015 2010/03/18
60474     Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 장성호 1631 2010/03/17
60475         Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 사루짱 1484 2010/03/17
60476             Re:Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ Nibble 1818 2010/03/17
60482                 Re:Re:Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 넘초보 2168 2010/03/17
60497                     Re:Re:Re:Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 사루짱 1602 2010/03/18
60605                         Re:Re:Re:Re:Re:Re:TCP통신 대용량 패킷이 올라오다가 중간에 짤려요 ㅜㅜ 넘초보 2052 2010/03/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.