데이터크기를 달고오면좋은데
안달고오니까 이거 사이즈 알수있는방법없냐구
주위에 물으니까 사이즈알아내는거없어? size, length뭐없어?
두번날라오는것도물어보니까 소켓이 알아서 다해줄텐데??
주위에서 이런소리들으니까 제가 저런생각을해버렸어요.
아무래도 더열심히해야겠네요
감사합니다
Lyn 님이 쓰신 글 :
: 안합쳐 줍니다.
:
: TCP는 패킷의 크기를 확인하는 방법이 프로토콜레벨에선 애초에 존재 하지 않습니다.
: 그냥 쭈~욱 날라올뿐
:
:
:
http://stream.delmadang.com/delmadang_lecture/Delphi/Internet/Messenger/Chat-1/chat-1.html
: 위 강좌 참조하세요.
:
: 알론소 님이 쓰신 글 :
: : 궁금한게 만약에 데이터 용량이커서 두번 날라온다면
: : 소켓이 알아서 두번날라온거 합쳐주지않나요?
: : 그리고
: : ETX가 안들어왔으면 들어올때까지 데이터쌓고싶은데
: : 아래처럼
: :
: : for(i = 0; i < sizeof(Buf); i++)
: : {
: : if(Buf[i] == DLE && Buf[i+1] == STX)
: : break;
: : }
: : i += 2;
: :
: :
: : while(!(Buf[i] == DLE && Buf[i+1] == ETX))
: : {
: : cDataBuf[k] = Buf[i];
: : if(Buf[i] == DLE)
: : {
: : i++;
: : }
: : k++;
: : i++;
: : }
: :
: : 들어온데이터 마지막부분이 ETX보일때까지
: : 데이터들을 다른배열로 복사하는 while문돌리고있는것밖에없고
: :
: : 그럼 iStackBufSize만큼 루프를 돌리면서
: : ETX검사하고 아니면 또 받고그런식으로하라는거죠?
: :
: : 저도 저렇게 iStackBufSize만큼 루프돌려서
: : ETX찾아보자 라고생각했는데
: : 이상하게 iStackBufSize가 정확하지 않을것같다는
: : 생각이드는거에요...그래서 iStackBufSize는 그냥 데이터 받을때만사용하지
: : 그이후에 처리할땐 별로 쓰고싶지않았거든요..
: :
: :
: :
: :
: : Lyn 님이 쓰신 글 :
: : : ETX안들어 왔으면 그냥 들어올때까지 데이터 쌓아두면 되죠 =_=a
: : :
: : : 알론소 님이 쓰신 글 :
: : : : 소켓 컴포넌트쓰지않구요 그냥
: : : :
: : : : TIdTCPClient *IdTCPClient;
: : : : 이렇게 선언해서 인디클라이언트 소켓사용하고있는데요
: : : : 문제는 send한다음에 receive할때 문젠대요
: : : :
: : : : 보통
: : : : try
: : : : {
: : : : iStackSize = IdTCPClient->ReadFromStack();
: : : : iStackBufSize = IdTCPClient->InputBuffer->Size;
: : : :
: : : : if(iStackBufSize > 0)
: : : : {
: : : : IdTCPClient->ReadBuffer(cRecvBuf, iStackBufSize);
: : : : memcpy(Buf, cRecvBuf, iStackBufSize);
: : : : } //end of if
: : : : else
: : : : return;
: : : :
: : : : } //end of try
: : : : catch ( Exception &e )
: : : : {
: : : : if(iStackBufSize == 0)
: : : : {
: : : : return;
: : : : }
: : : :
: : : : Thread_Exit();
: : : : return;
: : : : }
: : : :
: : : :
: : : :
: : : : 이런식으로해서 받는부분 처리하고있는대요
: : : : 원래는 보통 패킷주고받을때 데이터 사이즈를 모르니까
: : : : 앞부분에 데이터사이즈를 넣어서 데이터사이즈만큼 받잖아요
: : : : 근데 데이터사이즈를 안넣어주겠다고해서
: : : : 그럼 어떻게 데이터사이즈만큼 받지하고 생각하고
: : : : 검색하고 그러다가
: : : :
: : : : IdTCPClient->InputBuffer->Size
: : : : 있다는걸알게되었어요
: : : : 만약에 데이터사이즈를 아는 함수나 속성이 있다면
: : : : 좋은데 아무리 찾아봐도 없고 인디소켓같은경우는 저렇게 InputBuffer를
: : : : 사용해야한다고 그러더라구요
: : : :
: : : : 그래서 이걸어떻게 사용하지 이리저러
: : : : 막 쓰다가 결국엔 저렇게 코드를 짜버렸는데
: : : : 문제는
: : : : 그냥 보통 100바이트 안넘는걸 주로받거든요
: : : :
: : : : 간혹 근데 8000바이트조금넘는 데이터를 받는경우가있어요
: : : : 근데 어떨땐 8000이 한번에 들어오는경우가있던데
: : : : 어떨땐 1400바이트 그리고 나머지 6600바이트
: : : : 이런식으로 두번나눠서 들어오는경우가있는거에요
: : : :
: : : : 그래서 제가 어거지로
: : : :
: : : : iStackSize = IdTCPClient->ReadFromStack();
: : : : iStackBufSize = IdTCPClient->InputBuffer->Size;
: : : :
: : : : 이부분을 밑에 또썼거든요
: : : :
: : : : 전 만약에 두번나눠서 들어온다면 소켓이알아서
: : : : 다처리해줄줄알았는데
: : : :
: : : : 저위에 제가 짜논걸로하니깐
: : : : 1400바이트만 들어오고 뭐 또 반응도안하고
: : : : 계속 밑으로 쭉쭉 내려가는거에요
: : : :
: : : :
: : : : 그래서 밑에 ETX까지들어왔는지 돌리는 루프가있는데
: : : : 1400까지만들어오면 아직 데이터가 완벽하지않으니
: : : : 없잖아요 뒤에 데이터에있지
: : : :
: : : : 그래서 데이터를 완전하게 받질못하는거에요
: : : : 그냥 반토막난 데이터만받고 끝나구...
: : : :
: : : : 어떻게 해야하나요
: : : : 제가 혹시 저기 코드를 잘못짰나요??
: : : : 어떻게해야하죠...