본문 바로가기

Developement/eLinux

socket 의 recv() 는 항상 원하는 크기대로 오지 않는다 !

이전의 버퍼를 다 받아 오지 않던 문제를 ... 그간 PC 에서 socket processing 하던 편리함에 빠져 그 근본을 잊었던 것 같습니다.

 임베디드 보드가 지속적인 메모리의 malloc() 과 free() 때문인지 죽어 버리는 문제가 발생 하지만, 적어도 30MB 의 데이터를 지속적으로 500번 가량 전송 하는데 성공을 했습니다.

이유는 간단히, recv() 함수가 가진 특성을 그간 간과 했기 때문 입니다.

socket 에서 recv() 로 원하는 크기가 다 넘어 오지 않는다.

이 사실을 제가 간과 하고 있었네요. 너무나 기초적인  부분인데, 어찌 이런걸 제가 그간 잊고 있었을까요?
그래서 코드를 다음과 같이 수정 하였습니다.
	int  nRecvSize = 0;
	bool bRecvDone = false;

	printf(".. receiving data :");
	memset(pDataBuff, 0, nDataBuffSize);

	dwPrevTck = GetTickCount(); 
	while(!bRecvDone)
	{
		nRet = recv(fdSock,&pDataBuff[nRecvSize],nDataBuffSize,0);
		if(nRet)
		{
			nRecvSize += nRet;

			if(nRecvSize == nDataBuffSize)
				bRecvDone = true;
		}
	}
	dwNextTck = GetTickCount();

... 어렵지 않은걸 어렵게 돌아 갔었네요 ..
사람은 역시 기초에 항상 충실해야 하는 것 같습니다.