반응형
 
#ifndef MAX_MSG_LEN
#define MAX_MSG_LEN 1024
#endif
 
 
HEAD 부분에 들어 있는 길이를 읽은 이후에 해당 길이 만큼 BODY 데이터를 읽어 들일 경우 처리
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;
 
 
--------------------------------------------------------------------------------------------------------
 
반응형
Posted by 공간사랑
,