반응형
#ifndef MAX_MSG_LEN
#define MAX_MSG_LEN 1024
#endif
HEAD 부분에 들어 있는 길이를 읽은 이후에 해당 길이 만큼 BODY 데이터를 읽어 들일 경우 처리
2번에 걸쳐서 읽어 처리하기
2번에 걸쳐서 읽어 처리하기
--------------------------------------------------------------------------------------------------------
/*** HEAD부분읽기 ***/
memset(sRecvHeadMsg, 0x00, sizeof(sRecvHeadMsg));
nRecvHeadMsgLen = ReadLenTimeout(nSockFd, sRecvHeadMsg, nRecvHeadMsgExpectLen, nRecvHeadMsgTimeout);
if( nRecvHeadMsgLen <= 0 ) {
fprintf(stderr, "ERROR_READ_FAIL nRecvHeadLen[%d]\n", nRecvHeadMsgLen); fflush(stderr);
return -1;
}
if( nRecvHeadMsgLen > MAX_MSG_LEN ) {
fprintf(stderr, "ERROR_INVALID_LENGTH_MAX_VALUE_EXCEED nRecvHeadMsgLen[%d]\n", nRecvHeadMsgLen); fflush(stderr);
return -1;
}
if( nRecvHeadMsgLen != nRecvHeadMsgExpectLen ) {
fprintf(stderr, "ERROR_INVALID_LENGTH nRecvHeadMsgLen[%d] nRecvHeadExpectLen[%d] sRecvHeadMsg[%.*s]\n", nRecvHeadMsgLen, nRecvHeadMsgExpectLen, nRecvHeadMsgLen, sRecvHeadMsg); fflush(stderr);
return -1;
}
/*** 읽어야할 BODY 길이 계산 ***/
nRecvBodyMsgExpectLen = atoi(sRecvHeadMsg);
if( nRecvBodyMsgExpectLen <= 0 ) {
fprintf(stderr, "ERROR_INVALID_LENGTH nRecvBodyMsgExpectLen[%d]\n", nRecvBodyMsgExpectLen); fflush(stderr);
return -1;
}
if( nRecvBodyMsgExpectLen > MAX_MSG_LEN ) {
fprintf(stderr, "ERROR_INVALID_LENGTH_MAX_VALUE_EXCEED nRecvBodyMsgExpectLen[%d]\n", nRecvBodyMsgExpectLen); fflush(stderr);
return -1;
}
/*** BODY부분읽기 ***/
memset(sRecvBodyMsg, 0x00, sizeof(sRecvBodyMsg));
nRecvBodyMsgLen = ReadLenTimeout(nSockFd, sRecvBodyMsg, nRecvBodyMsgExpectLen, nRecvBodyMsgTimeout);
if( nRecvBodyMsgLen <= 0 ) {
fprintf(stderr, "ERROR_READ_FAIL nRecvBodyMsgLen[%d]\n", nRecvBodyMsgLen); fflush(stderr);
return -1;
}
if( nRecvBodyMsgLen > MAX_MSG_LEN ) {
fprintf(stderr, "ERROR_INVALID_LENGTH_MAX_VALUE_EXCEED nRecvBodyMsgLen[%d]\n", nRecvBodyMsgLen); fflush(stderr);
return -1;
}
if( nRecvBodyMsgLen != nRecvBodyMsgExpectLen ) {
fprintf(stderr, "ERROR_INVALID_LENGTH nRecvBodyMsgLen[%d] nRecvBodyMsgExpectLen[%d] sRecvBodyMsg[%.*s]\n", nRecvBodyMsgLen, nRecvBodyMsgExpectLen, nRecvBodyMsgLen, sRecvBodyMsg); fflush(stderr);
return -1;
}
/*** HEAD데이터와 BODY데이터전체 ***/
memset(sRecvDataMsg, 0x00, sizeof(sRecvDataMsg));
memcpy(sRecvDataMsg, sRecvHeadMsg, nRecvHeadMsgLen);
memcpy(&sRecvDataMsg[nRecvHeadMsgLen], sRecvBodyMsg, nRecvBodyMsgLen);
nRecvDataMsgLen = nRecvHeadMsgLen + nRecvBodyMsgLen;
--------------------------------------------------------------------------------------------------------
반응형