/* 사용자지정 프로토콜 */
#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 내 변수형에 따라 지정된 메소드로 값을 가져온다
- 통신 종료후 클라이언트와의 접속 끊기
