|
소켓 컴포넌트쓰지않구요 그냥
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까지만들어오면 아직 데이터가 완벽하지않으니
없잖아요 뒤에 데이터에있지
그래서 데이터를 완전하게 받질못하는거에요
그냥 반토막난 데이터만받고 끝나구...
어떻게 해야하나요
제가 혹시 저기 코드를 잘못짰나요??
어떻게해야하죠...
|