read, recv 함수가 자료수신할때..
글쓴이: sinta / 작성시간: 목, 2010/06/17 - 9:53오전
안녕하세요 read, recv 함수에 대해 문의드리려고 합니다.
현재 소켓통신으로 전문을 주고 받는 프로그램을 하고 있습니다.
서버에서 보낸 전문을 클라이언트에서 수신하게 되는데
클라이언트는 OS는 리눅스이고 C로 수신하게 되어 있습니다.
read함수를 사용해서 소켓연결자에서 특정사이즈만 받는 경우가 자주 발생하고
가끔 정상적으로 수신합니다. recv로 수정해도 마찬가지인경우인데요....
read나 recv함수가 정상적으로 수신하지 못하는 경우 이런 현상이 발생하는 경우가 있나요?
read하는 부분 소스만 첨부합니다.
while ((nSendLen = recv(nSvrSock, rcvbuf, sizeof(rcvbuf), 0)) > 0)
{
memcpy(&readbuf[nRcvLen], rcvbuf, nSendLen);
memset(gcaErrMsg, 0x0, sizeof(gcaErrMsg));
sprintf(gcaErrMsg, "수신한값[%d] : %s", nSendLen, rcvbuf);
l_errlog(gcaPgmID, gcaErrMsg, LOG4);
nRcvLen += nSendLen;
memset(rcvbuf, 0x0, sizeof(rcvbuf));
/* if (rcvbuf[nRcvLen] == '\0') break; */
if (nSendLen < 2048) break;
}
Forums:
if (nSendLen < 2048)
이부분이
이렇게 되야 되지 않을까요?
-----------------------
좋은사람한테 잘해라, 물어보자 남의 머리속을 볼수 없으니..
2010. 1. 20일을 기억하기를 바라며
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
그부분은..
2048씩 읽어온 후 읽어온 크기가 2048보다 작으면 break로 빠져나가기 위해 만든 조건문입니다.
아.. 제가 nRcvLen에 대한 설명이 없었네요..
nRcvLen은 배열 주소로 사용하기 위해서 0에서 시작해서 읽어온 nSendLen을 계속 더해가는 변수입니다.
이상한건.. 이게 성공할떄는 정상적으로 읽어오지만 실패할떄는 항상 1460 이라는 사이즈만 읽어서 실패하게됩니다.
그리고 데이터의 크기가 커질수록 성공횟수는 현저하게 줄어들고요..
기본적으로 1460의 크기만큼 Read를 못해서 실패한다고 생각하고 있었는데..
만약에 1460보다 작은 사이즈로 계속 while로 읽는다면 성공해야하지 않을까 싶습니다. (제생각엔...)
그런데 1048로 읽어와도 1460에서 종료가 발생합니다.
소켓연결자인 nSvrSock 자체에 1460만 들어왔다고 생각하는게 맞을까요??
댓글 달기