클라이언트와 통신

/* 사용자지정 프로토콜 */
#define PROTOCOL_ZERO 0
#define PROTOCOL_KNOCK 1    // 똑똑
#define PROTOCOL_WHO 2      // 누구냐?
#define PROTOCOL_IAM 3      // 저는요
#define PROTOCOL_SO 4       // 그래서?
#define PROTOCOL_SPEAK 5    // 잡담
#define PROTOCOL_NOISY 6    // 시끄
#define PROTOCOL_BYE 7      // 이만가요

unsigned int rtn = 0, var_cnt = 0, var_type; /* 함수리턴값, 수신data내 변수 갯수, 변수타입*/
    
while (1) {
    // 수신대기
    if ((rtn = zwSock.RecvAwait(client_fd)) < 0)
        break;

    // 수신Data Stream 내 변수 Count
    var_cnt = zwSock.GetVarCnt();

    // 애플리케이션 프로토콜을 확인하여 대응한다
    switch (rtn) {
    case PROTOCOL_ZERO: {
        continue;
    }
    case PROTOCOL_KNOCK: {
        // 송신할 프로토콜 지정
        zwSock.SetCmd(PROTOCOL_WHO);
        // 송신
        zwSock.Send(client_fd);
        printf("RSP : PROTOCOL_WHO\n");
        continue;
    }
    case PROTOCOL_IAM: {
        // PROTOCOL_IAM 프로토콜에는 하나의 문자열이 포함돼 있다는 약속 하에
        if (var_cnt > 1) {
            msg = zwSock.GetVarString(1);
            printf("Client : %s\n", msg);
        }
        zwSock.SetCmd(PROTOCOL_SO);
        zwSock.Send(client_fd);
        printf("RSP : PROTOCOL_SO\n");
        continue;
    }
    case PROTOCOL_SPEAK: {
        if (var_cnt > 1) {
            // 변수형에 따른 수신 값을 가져온다
            for (int i = 1; i <= var_cnt; i++) {
                var_type = zwSock.GetVarType(i);
                switch (var_type) {
                case ZW_SOCK_INT: {
                    num = zwSock.GetVarInt(i);
                    printf("Client : %d\n", num);
                    break;
                }
                case ZW_SOCK_STRING: {
                    msg = zwSock.GetVarString(i);
                    printf("Client : %s\n", msg);
                    break;
                }
                default:
                    continue;
                }
            }
        }
        zwSock.SetCmd(PROTOCOL_NOISY);
        zwSock.Send(client_fd);
        printf("RSP : PROTOCOL_NOISY\n");
        continue;
    }
    case PROTOCOL_BYE: {
        if (var_cnt > 1) {
            msg = zwSock.GetVarString(1);
            printf("Client : %s\n", msg);
        }
        break;
    }
    default: {
        continue;
    }
    }

    if (rtn == PROTOCOL_BYE)
        break;
}
zwSock.Close(client_fd); /* 클라이언트 끊기 */

해당 코드의 개요

    • LibZWSock::RecvAwait() 메소드로 Data를 수신
    • 클라이언트와 약속된 프로토콜별 처리
    • 수신Data Stream 내 변수형에 따라 지정된 메소드로 값을 가져온다
    • 통신 종료후 클라이언트와의 접속 끊기
error: Content is protected !!
위로 스크롤