From 057e4e29b00e6775b7dcfd581f60ceed29984eb3 Mon Sep 17 00:00:00 2001 From: sjdok9612 <56342332+sjdok9612@users.noreply.github.com> Date: Sun, 23 May 2021 03:17:03 +0900 Subject: [PATCH 01/17] Update s.c --- s.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/s.c b/s.c index d41e2d3..adf2cf7 100644 --- a/s.c +++ b/s.c @@ -21,6 +21,7 @@ void send_msg(char* msg, int len); int turn[4]; int clnt_cnt = 0; int clnt_socks[MAX_CLNT]; +int msgQ[5][BUF_SIZE]; pthread_mutex_t mutx; pthread_t t_id; @@ -78,9 +79,29 @@ void* handle_clnt(void* arg) { int clnt_sock = *((int*)arg); int str_len = 0, i; char msg[BUF_SIZE]; - - while ((str_len = read(clnt_sock, msg, sizeof(msg))) != 0) - send_msg(msg, str_len); + //handle_clnt의 메세지 수신부분 + while ((str_len = read(clnt_sock, msg, sizeof(msg))) != 0){ + printf("msg0: %s\n msg1: %s\n msg2: %s\n msg3: %s\n",msgQ[0],msgQ[1],msgQ[2],msgQ[3]); + if(strcmp(msg[0],"C")==0){ + /* + strcpy(msgQ[3],msgQ[2]); + strcpy(msgQ[2],msgQ[1]); + strcpy(msgQ[1],msgQ[0]); + strcpy(msgQ[0],msg); + + send_msg("msg0:", str_len); + send_msg(msg[0], str_len); + send_msg("msg1:", str_len); + send_msg(msg[1], str_len); + send_msg("msg2:", str_len); + send_msg(msg[2], str_len); + send_msg("msg3:", str_len); + send_msg(msg[3], str_len); + */ + } + else + + } pthread_mutex_lock(&mutx); for (i = 0; i < clnt_cnt; i++) //eliminated disconnections { From 007757ac9e82c7e87f6cdf6981ad80edc5802dba Mon Sep 17 00:00:00 2001 From: sjdok9612 <56342332+sjdok9612@users.noreply.github.com> Date: Sun, 23 May 2021 03:17:55 +0900 Subject: [PATCH 02/17] Update c.c --- c.c | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/c.c b/c.c index 710513b..a582a0b 100644 --- a/c.c +++ b/c.c @@ -17,6 +17,7 @@ void* recv_msg(void* arg); void error_handling(char* mse); void game_print(int any); +void chatUI(int s); int turn_count = 0; int board[BOARD_SIZE][BOARD_SIZE]; @@ -80,20 +81,32 @@ int main(int argc, char* argv[]) void* send_msg(void* arg) { int sock = *((int*)arg); - char msg[BUF_SIZE]; + char msg[BUF_SIZE-1]; while (1) { - fgets(msg, BUF_SIZE, stdin); - if (!strcmp(msg, "q\n")||!strcmp(msg,"Q\n")) + chatUI(0); + fgets(msg, BUF_SIZE-1, stdin); + if (!strcmp(msg, "q\n")||!strcmp(msg,"Q\n"))//Q를 입력하면 종료로 인식한다. { close(sock); exit(0); } - else if(!strcmp(msg, "c\n")||!strcmp(msg,"C\n")) { - sscanf(chat, "%s", msg); + else if(!strcmp(msg, "c\n")||!strcmp(msg,"C\n")) //C를 입력하면 채팅입력창을 출력한다. + { + //C를 인식하였다. 채팅을 입력받기전에 msg[]를 null로 초기화 하여 오류를 방지한다. + for(int i=0; i Date: Sun, 23 May 2021 03:19:41 +0900 Subject: [PATCH 03/17] Update s.c --- s.c | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/s.c b/s.c index adf2cf7..8129b40 100644 --- a/s.c +++ b/s.c @@ -80,28 +80,7 @@ void* handle_clnt(void* arg) { int str_len = 0, i; char msg[BUF_SIZE]; //handle_clnt의 메세지 수신부분 - while ((str_len = read(clnt_sock, msg, sizeof(msg))) != 0){ - printf("msg0: %s\n msg1: %s\n msg2: %s\n msg3: %s\n",msgQ[0],msgQ[1],msgQ[2],msgQ[3]); - if(strcmp(msg[0],"C")==0){ - /* - strcpy(msgQ[3],msgQ[2]); - strcpy(msgQ[2],msgQ[1]); - strcpy(msgQ[1],msgQ[0]); - strcpy(msgQ[0],msg); - - send_msg("msg0:", str_len); - send_msg(msg[0], str_len); - send_msg("msg1:", str_len); - send_msg(msg[1], str_len); - send_msg("msg2:", str_len); - send_msg(msg[2], str_len); - send_msg("msg3:", str_len); - send_msg(msg[3], str_len); - */ - } - else - - } + pthread_mutex_lock(&mutx); for (i = 0; i < clnt_cnt; i++) //eliminated disconnections { From b8704b233b6b58764ad3eee53b48bd9285c41f23 Mon Sep 17 00:00:00 2001 From: sjdok9612 <56342332+sjdok9612@users.noreply.github.com> Date: Sun, 23 May 2021 05:14:56 +0900 Subject: [PATCH 04/17] Update s.c --- s.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/s.c b/s.c index 8129b40..8e1ff4b 100644 --- a/s.c +++ b/s.c @@ -16,14 +16,22 @@ void error_handling(char* mse); void* handle_clnt(void* arg); +void* status_board(void* arg); void send_msg(char* msg, int len); int turn[4]; + int clnt_cnt = 0; int clnt_socks[MAX_CLNT]; -int msgQ[5][BUF_SIZE]; +struct Clnt{ + char IP[16]; + int PORT; +}; +struct Clnt C[MAX_CLNT]; +char msgQ[5][BUF_SIZE]; pthread_mutex_t mutx; pthread_t t_id; +pthread_t t_id2; int main(int argc, char* argv[]) { @@ -48,21 +56,22 @@ int main(int argc, char* argv[]) if (listen(serv_sock, 5) == -1) { error_handling("listen() error"); } - printf("var reset, ip port allocate, listen"); + printf("var reset, ip port allocate, listen, setting all cleared. start in 5sec \n"); + sleep(5); + pthread_create(&t_id2, NULL, status_board, (void*)&clnt_sock); + pthread_detach(t_id2); while (1) { clnt_adr_sz = sizeof(clnt_adr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); pthread_mutex_lock(&mutx); - clnt_socks[clnt_cnt++] = clnt_sock; + clnt_socks[clnt_cnt] = clnt_sock; pthread_mutex_unlock(&mutx); pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock); pthread_detach(t_id); - printf("Connected Clnt IP : %s \n", inet_ntoa(clnt_adr.sin_addr)); - - printf("* %s:%d connect\n", inet_ntoa(clnt_adr.sin_addr), ntohs(clnt_adr.sin_port)); - printf(".\n"); + strcpy(C[clnt_cnt].IP,inet_ntoa(clnt_adr.sin_addr)); + C[clnt_cnt++].PORT=ntohs(clnt_adr.sin_port); } close(serv_sock); return 0; @@ -80,7 +89,15 @@ void* handle_clnt(void* arg) { int str_len = 0, i; char msg[BUF_SIZE]; //handle_clnt의 메세지 수신부분 - + while ((str_len = read(clnt_sock, msg, sizeof(msg))) != 0){ + printf("[Debug]red\n"); + strcpy(msgQ[4],msgQ[3]); + strcpy(msgQ[3],msgQ[2]); + strcpy(msgQ[2],msgQ[1]); + strcpy(msgQ[1],msgQ[0]); + strcpy(msgQ[0],msg); + //send_msg(msg, str_len); + } pthread_mutex_lock(&mutx); for (i = 0; i < clnt_cnt; i++) //eliminated disconnections { @@ -88,6 +105,7 @@ void* handle_clnt(void* arg) { { while (i++ < clnt_cnt - 1) clnt_socks[i] = clnt_socks[i + 1]; + memcpy(&C[i],&C[i+1],sizeof(struct Clnt)); break; } } @@ -96,6 +114,27 @@ void* handle_clnt(void* arg) { close(clnt_sock); return NULL; } +void* status_board(void* arg){ + while(1){ + system("clear"); + //접속클라이언트 현황 + printf("CLNT\t|IP\t\t|PORT\t|\n"); + for(int i=0; i Date: Sun, 23 May 2021 05:14:59 +0900 Subject: [PATCH 05/17] Update c.c --- c.c | 1 + 1 file changed, 1 insertion(+) diff --git a/c.c b/c.c index a582a0b..721b1e7 100644 --- a/c.c +++ b/c.c @@ -99,6 +99,7 @@ void* send_msg(void* arg) { //초기화된 msg[]에 채팅 내역을 다시 받는다. chatUI(1); fgets(msg, BUF_SIZE, stdin); + msg[strlen(msg)-1]='\0';//개행문자 제거 //msg[]의 맨앞에 C를 끼워넣어서 서버에게 보낸다. 서버가 문자열을 클라이언트에게 재송신하면 recive_msg가 문자열이 C로 시작하는지if처리한다. chat[0]='C'; for(int i=0; i Date: Sun, 23 May 2021 21:35:55 +0900 Subject: [PATCH 06/17] Update s.c --- s.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/s.c b/s.c index 8e1ff4b..a26c1c1 100644 --- a/s.c +++ b/s.c @@ -10,12 +10,14 @@ #include #include #define BOARD_SIZE 5 +#define NAME_SIZE 10 #define BUF_SIZE 100 #define BACKLOG 3 #define MAX_CLNT 256 void error_handling(char* mse); void* handle_clnt(void* arg); +void* handle_game(void* arg); void* status_board(void* arg); void send_msg(char* msg, int len); @@ -26,18 +28,22 @@ int clnt_socks[MAX_CLNT]; struct Clnt{ char IP[16]; int PORT; + char NAME[10];//동적할당으로 수정전에 NAME_SIZE를 10으로 임의 + int R; }; struct Clnt C[MAX_CLNT]; -char msgQ[5][BUF_SIZE]; +char msgQ[5][NAME_SIZE+BUF_SIZE]; pthread_mutex_t mutx; pthread_t t_id; pthread_t t_id2; +pthread_t t_id3; int main(int argc, char* argv[]) { int serv_sock, clnt_sock; struct sockaddr_in serv_adr, clnt_adr; int clnt_adr_sz; + char name[NAME_SIZE]="[DEFAULT]"; pthread_t t_id; if (argc != 2) { printf("insert port."); @@ -58,9 +64,16 @@ int main(int argc, char* argv[]) } printf("var reset, ip port allocate, listen, setting all cleared. start in 5sec \n"); sleep(5); + pthread_create(&t_id2, NULL, status_board, (void*)&clnt_sock); pthread_detach(t_id2); + + pthread_create(&t_id3, NULL, handle_game, (void*)&clnt_sock); + pthread_detach(t_id3); + while (1) { + int str_len; + char msg[1+NAME_SIZE+BUF_SIZE]; clnt_adr_sz = sizeof(clnt_adr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); @@ -70,15 +83,16 @@ int main(int argc, char* argv[]) pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock); pthread_detach(t_id); - strcpy(C[clnt_cnt].IP,inet_ntoa(clnt_adr.sin_addr)); - C[clnt_cnt++].PORT=ntohs(clnt_adr.sin_port); + strcpy(C[clnt_cnt].IP,inet_ntoa(clnt_adr.sin_addr));//클라이언트 주소저장 + C[clnt_cnt].PORT=ntohs(clnt_adr.sin_port);//클라이언트의 포트저장 + C[clnt_cnt].R=0;//클라이언트가 레디하지않음으로 설정 + clnt_cnt++; } close(serv_sock); return 0; } -void error_handling(char* msg) -{ +void error_handling(char* msg){ fputs(msg, stderr); fputc('\n', stderr); exit(1); @@ -87,17 +101,46 @@ void error_handling(char* msg) void* handle_clnt(void* arg) { int clnt_sock = *((int*)arg); int str_len = 0, i; - char msg[BUF_SIZE]; + char msg[1+NAME_SIZE+BUF_SIZE]; + for(int i=0; i Date: Sun, 23 May 2021 21:35:57 +0900 Subject: [PATCH 07/17] Update c.c --- c.c | 76 ++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/c.c b/c.c index 721b1e7..169f51c 100644 --- a/c.c +++ b/c.c @@ -10,6 +10,7 @@ #include #define BOARD_SIZE 5 +#define NAME_SIZE 10 #define BUF_SIZE 100 void* send_msg(void* arg); @@ -19,11 +20,11 @@ void error_handling(char* mse); void game_print(int any); void chatUI(int s); -int turn_count = 0; +int Game_on=0; int board[BOARD_SIZE][BOARD_SIZE]; -char* chatting[BUF_SIZE]; -char chat[BUF_SIZE]; -int chattingCount = 0; +char name[NAME_SIZE]="[DEFAULT]"; +char chat[NAME_SIZE+BUF_SIZE+1]; + int main(int argc, char* argv[]) @@ -55,10 +56,11 @@ int main(int argc, char* argv[]) - if (argc != 3) { - printf("ip, port"); + if (argc != 4) { + printf("ip, port, name"); exit(1); } + sprintf(name,"[%s]",argv[3]); sock = socket(PF_INET, SOCK_STREAM, 0); @@ -69,7 +71,6 @@ int main(int argc, char* argv[]) if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) error_handling("connect err"); - pthread_create(&snd_thread, NULL, send_msg, (void*)&sock); pthread_create(&rcv_thread, NULL, recv_msg, (void*)&sock); pthread_join(snd_thread, &thread_return); @@ -81,8 +82,11 @@ int main(int argc, char* argv[]) void* send_msg(void* arg) { int sock = *((int*)arg); - char msg[BUF_SIZE-1]; - while (1) { + char msg[BUF_SIZE]; + sprintf(chat,"%s%s","N",name);//이름을 최초 1회 보내는걸로 검증한다. + write(sock, chat, strlen(chat)); printf("name sended"); + while (1) + { chatUI(0); fgets(msg, BUF_SIZE-1, stdin); if (!strcmp(msg, "q\n")||!strcmp(msg,"Q\n"))//Q를 입력하면 종료로 인식한다. @@ -93,21 +97,33 @@ void* send_msg(void* arg) { else if(!strcmp(msg, "c\n")||!strcmp(msg,"C\n")) //C를 입력하면 채팅입력창을 출력한다. { //C를 인식하였다. 채팅을 입력받기전에 msg[]를 null로 초기화 하여 오류를 방지한다. - for(int i=0; i Date: Mon, 24 May 2021 02:00:20 +0900 Subject: [PATCH 08/17] =?UTF-8?q?Update=20and=20rename=20c.c=20to=20c(sele?= =?UTF-8?q?ct=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c.c => "c(select\354\213\234\355\227\230).c" | 40 ++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) rename c.c => "c(select\354\213\234\355\227\230).c" (81%) diff --git a/c.c "b/c(select\354\213\234\355\227\230).c" similarity index 81% rename from c.c rename to "c(select\354\213\234\355\227\230).c" index 169f51c..4a25606 100644 --- a/c.c +++ "b/c(select\354\213\234\355\227\230).c" @@ -15,12 +15,14 @@ void* send_msg(void* arg); void* recv_msg(void* arg); +void* game_set(void* arg); void error_handling(char* mse); void game_print(int any); void chatUI(int s); int Game_on=0; +int my_turn=0; int board[BOARD_SIZE][BOARD_SIZE]; char name[NAME_SIZE]="[DEFAULT]"; char chat[NAME_SIZE+BUF_SIZE+1]; @@ -73,8 +75,13 @@ int main(int argc, char* argv[]) error_handling("connect err"); pthread_create(&snd_thread, NULL, send_msg, (void*)&sock); pthread_create(&rcv_thread, NULL, recv_msg, (void*)&sock); + pthread_create(&gam_thread, NULL, game_set, (void*)&sock); + //pthread_detach(snd_thread); + //pthread_detach(rcv_thread); + //pthread_detach(gam_thread); pthread_join(snd_thread, &thread_return); pthread_join(rcv_thread, &thread_return); + pthread_join(gam_thread, &thread_return); close(sock); return 0; @@ -84,10 +91,9 @@ void* send_msg(void* arg) { int sock = *((int*)arg); char msg[BUF_SIZE]; sprintf(chat,"%s%s","N",name);//이름을 최초 1회 보내는걸로 검증한다. - write(sock, chat, strlen(chat)); printf("name sended"); + write(sock, chat, strlen(chat)); while (1) { - chatUI(0); fgets(msg, BUF_SIZE-1, stdin); if (!strcmp(msg, "q\n")||!strcmp(msg,"Q\n"))//Q를 입력하면 종료로 인식한다. { @@ -140,10 +146,38 @@ void* recv_msg(void* arg) { { Game_on=1; } - fputs(msg, stdout); + } return NULL; } +void* game_set(void* arg){ + int sock = *((int*)arg); + fd_set reads, cpy_reads; + int fd_max, str_len, fd_num; + struct timeval timeout; + FD_ZERO(&reads); + FD_SET(sock, &reads); + fd_max=sock; + + while(1){ + cpy_reads=reads; + timeout.tv_sec=5; + timeout.tv_usec=5000; + if((fd_num=select(fd_max+1,&cpy_reads,0,0,&timeout))==-1) break; + if(fd_num==0)continue; + for(int i=0; i Date: Mon, 24 May 2021 07:02:48 +0900 Subject: [PATCH 09/17] Update s.c --- s.c | 67 ++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/s.c b/s.c index a26c1c1..ea0dae2 100644 --- a/s.c +++ b/s.c @@ -19,17 +19,17 @@ void error_handling(char* mse); void* handle_clnt(void* arg); void* handle_game(void* arg); void* status_board(void* arg); -void send_msg(char* msg, int len); +void send_msg(char* msg, int len,int index); -int turn[4]; int clnt_cnt = 0; int clnt_socks[MAX_CLNT]; +int Game_on=0;//게임이 시작되면 1이 되고, 추가 접속을 막는다. 게임이 끝나면 2가 되고, exit한다(쓰레드정리+동적할당정리+main끝) struct Clnt{ char IP[16]; int PORT; char NAME[10];//동적할당으로 수정전에 NAME_SIZE를 10으로 임의 - int R; + int R;//0은 준비중 1은 준비완료 2는 }; struct Clnt C[MAX_CLNT]; char msgQ[5][NAME_SIZE+BUF_SIZE]; @@ -71,7 +71,7 @@ int main(int argc, char* argv[]) pthread_create(&t_id3, NULL, handle_game, (void*)&clnt_sock); pthread_detach(t_id3); - while (1) { + while (Game_on!=1) { int str_len; char msg[1+NAME_SIZE+BUF_SIZE]; clnt_adr_sz = sizeof(clnt_adr); @@ -88,8 +88,10 @@ int main(int argc, char* argv[]) C[clnt_cnt].R=0;//클라이언트가 레디하지않음으로 설정 clnt_cnt++; } + if(Game_on!=2){ close(serv_sock); return 0; + } } void error_handling(char* msg){ @@ -106,37 +108,44 @@ void* handle_clnt(void* arg) { msg[i]='\0'; } //handle_clnt의 메세지 수신부분 + send_msg("",1,0);//서로 연결이 확정되면 의미없는 문장을 보내서, 클라이언트의 RCV와 game_print를 활성화시킨다 while ((str_len = read(clnt_sock, msg, sizeof(msg))) != 0) { + printf("[Debug]red is it correct? :%s\n",msg); + char tmpName[10]; // + for(int i=0,j=0;i<10;i++){ + if(msg[i+1]!=32) {tmpName[j++]=msg[i+1];} + } + char tmpMsg[100]; // + for(int i=0;i<111;i++){ + tmpMsg[i]=msg[i+11]; + } + if(msg[0]==78) //N로 시작하는 네임세팅이 오면 { - char tmp[10]; - for(int i=0; i<10;i++){ - tmp[i]=msg[i+1]; - } - strcpy(C[clnt_cnt-1].NAME,tmp); + strcpy(C[clnt_cnt-1].NAME,tmpName); } - printf("[Debug]red\n"); if(msg[0]==67) //C로 시작하는 채팅내역이오면 { - //for(int i=0; i1){ int ready_check=1; for(int i=0; i Date: Mon, 24 May 2021 07:02:51 +0900 Subject: [PATCH 10/17] =?UTF-8?q?Update=20c(select=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "c(select\354\213\234\355\227\230).c" | 93 +++++++++++++-------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git "a/c(select\354\213\234\355\227\230).c" "b/c(select\354\213\234\355\227\230).c" index 4a25606..291f46d 100644 --- "a/c(select\354\213\234\355\227\230).c" +++ "b/c(select\354\213\234\355\227\230).c" @@ -26,6 +26,7 @@ int my_turn=0; int board[BOARD_SIZE][BOARD_SIZE]; char name[NAME_SIZE]="[DEFAULT]"; char chat[NAME_SIZE+BUF_SIZE+1]; +char msgQ[5][NAME_SIZE+BUF_SIZE]; @@ -82,32 +83,31 @@ int main(int argc, char* argv[]) pthread_join(snd_thread, &thread_return); pthread_join(rcv_thread, &thread_return); pthread_join(gam_thread, &thread_return); - + if(1){ close(sock); - return 0; + return 0;} } void* send_msg(void* arg) { int sock = *((int*)arg); char msg[BUF_SIZE]; - sprintf(chat,"%s%s","N",name);//이름을 최초 1회 보내는걸로 검증한다. + sprintf(chat,"%1s%10s","N",name);//이름을 최초 1회 보내는걸로 검증한다. write(sock, chat, strlen(chat)); while (1) - { - fgets(msg, BUF_SIZE-1, stdin); + { + //배열버퍼, stdin버퍼 초기화 + for(int i=0; i Date: Mon, 24 May 2021 08:20:44 +0900 Subject: [PATCH 11/17] Update s.c --- s.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/s.c b/s.c index ea0dae2..1bbdc68 100644 --- a/s.c +++ b/s.c @@ -121,7 +121,7 @@ void* handle_clnt(void* arg) { tmpMsg[i]=msg[i+11]; } - if(msg[0]==78) //N로 시작하는 네임세팅이 오면 + if(msg[0]==83) //S로 시작하는 네임세팅이 오면 { strcpy(C[clnt_cnt-1].NAME,tmpName); } @@ -147,6 +147,32 @@ void* handle_clnt(void* arg) { } send_msg("",1,2);//의미없는문자열을 보내서 클라이언트쪽 화면을 제어해준다 } + + if(msg[0]==78) //N로 시작하는 숫자내역이오면 + { + for(int i=0; i1){ - int ready_check=1; - for(int i=0; i1&&C[0].R==1) { - send_msg("GAMEON",1+BUF_SIZE+NAME_SIZE,3); - sleep(1); - send_msg("GAMEON",1+BUF_SIZE+NAME_SIZE,3);//왜 인지 모르겠지만 가장 전송누락이 잦은 부분. 주의 - for(int i=0;i Date: Mon, 24 May 2021 08:20:46 +0900 Subject: [PATCH 12/17] =?UTF-8?q?Update=20c(select=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "c(select\354\213\234\355\227\230).c" | 47 ++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git "a/c(select\354\213\234\355\227\230).c" "b/c(select\354\213\234\355\227\230).c" index 291f46d..8809d41 100644 --- "a/c(select\354\213\234\355\227\230).c" +++ "b/c(select\354\213\234\355\227\230).c" @@ -21,14 +21,19 @@ void error_handling(char* mse); void game_print(int any); void chatUI(int s); +//게임관련 구조체로 묶을 변수 int Game_on=0; +int game_turn=0; int my_turn=0; +int my_bingo=0; int board[BOARD_SIZE][BOARD_SIZE]; -char name[NAME_SIZE]="[DEFAULT]"; + +//채팅관련 구조체로 묶을변수 char chat[NAME_SIZE+BUF_SIZE+1]; char msgQ[5][NAME_SIZE+BUF_SIZE]; - +//main의 매개변수용 char +char name[NAME_SIZE]="[DEFAULT]"; int main(int argc, char* argv[]) { @@ -91,7 +96,7 @@ int main(int argc, char* argv[]) void* send_msg(void* arg) { int sock = *((int*)arg); char msg[BUF_SIZE]; - sprintf(chat,"%1s%10s","N",name);//이름을 최초 1회 보내는걸로 검증한다. + sprintf(chat,"%1s%10s","S",name);//이름을 최초 1회 보내는걸로 검증한다. write(sock, chat, strlen(chat)); while (1) { @@ -117,6 +122,17 @@ void* send_msg(void* arg) { write(sock, chat, strlen(chat)); printf("[Debug]writed\n"); } + if(my_turn==1&&!strcmp(msg,"N\n")) //내턴일때 N을 입력하면 숫자를 입력받는다. + { + chatUI(1); + fgets(msg, BUF_SIZE, stdin); + msg[strlen(msg)-1]='\0';//개행문자 제거 + //입력받은 msg로 chat내용을 세그먼트화 한다. (채팅-10자리이름(공백으로 줄맞춤)-메세지내용) + sprintf(chat,"%1s%10s%s","N",name,msg); + write(sock, chat, strlen(chat)); + my_turn--; + printf("[Debug]writed\n"); + } else if(!strcmp(msg, "r\n")||!strcmp(msg,"R\n")) //R를 입력하면 레디내역을 서버에보낸다. { for(int i=0; i Date: Tue, 25 May 2021 03:22:56 +0900 Subject: [PATCH 13/17] =?UTF-8?q?Update=20c(select=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "c(select\354\213\234\355\227\230).c" | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git "a/c(select\354\213\234\355\227\230).c" "b/c(select\354\213\234\355\227\230).c" index 8809d41..39c93bf 100644 --- "a/c(select\354\213\234\355\227\230).c" +++ "b/c(select\354\213\234\355\227\230).c" @@ -22,11 +22,17 @@ void game_print(int any); void chatUI(int s); //게임관련 구조체로 묶을 변수 -int Game_on=0; -int game_turn=0; -int my_turn=0; -int my_bingo=0; +struct Game{ +int Game_on; +int game_turn; +int my_turn; +int my_bingo; int board[BOARD_SIZE][BOARD_SIZE]; +int bingo[BOARD_SIZE][BOARD_SIZE]; + +}; +struct MyGame ={0,0,0,0}; + //채팅관련 구조체로 묶을변수 char chat[NAME_SIZE+BUF_SIZE+1]; From 3657fa78135c04109c74bb534aad9d6e4029704f Mon Sep 17 00:00:00 2001 From: sjdok9612 <56342332+sjdok9612@users.noreply.github.com> Date: Tue, 25 May 2021 03:25:22 +0900 Subject: [PATCH 14/17] =?UTF-8?q?Update=20c(select=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "c(select\354\213\234\355\227\230).c" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/c(select\354\213\234\355\227\230).c" "b/c(select\354\213\234\355\227\230).c" index 39c93bf..22aac94 100644 --- "a/c(select\354\213\234\355\227\230).c" +++ "b/c(select\354\213\234\355\227\230).c" @@ -61,7 +61,7 @@ int main(int argc, char* argv[]) if (check_number[temp] == 0) { check_number[temp] = 1; - board[i][j] = temp + 1; + MyGame.board[i][j] = temp + 1; break; } } @@ -128,7 +128,7 @@ void* send_msg(void* arg) { write(sock, chat, strlen(chat)); printf("[Debug]writed\n"); } - if(my_turn==1&&!strcmp(msg,"N\n")) //내턴일때 N을 입력하면 숫자를 입력받는다. + if(MyGame.my_turn==1&&!strcmp(msg,"N\n")) //내턴일때 N을 입력하면 숫자를 입력받는다. { chatUI(1); fgets(msg, BUF_SIZE, stdin); @@ -136,7 +136,7 @@ void* send_msg(void* arg) { //입력받은 msg로 chat내용을 세그먼트화 한다. (채팅-10자리이름(공백으로 줄맞춤)-메세지내용) sprintf(chat,"%1s%10s%s","N",name,msg); write(sock, chat, strlen(chat)); - my_turn--; + MyGame.my_turn--; printf("[Debug]writed\n"); } else if(!strcmp(msg, "r\n")||!strcmp(msg,"R\n")) //R를 입력하면 레디내역을 서버에보낸다. @@ -169,7 +169,7 @@ void* recv_msg(void* arg) { tmpMsg[i]=msg[i+11]; } system("clear"); - if(strcmp(msg,"GAMEON")==0) Game_on=1; + if(strcmp(msg,"GAMEON")==0) MyGame.Game_on=1; if(msg[0]==67) //C로 시작하는 채팅내역이오면 { //for(int i=0; i Date: Tue, 25 May 2021 04:29:40 +0900 Subject: [PATCH 15/17] =?UTF-8?q?Update=20c(select=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "c(select\354\213\234\355\227\230).c" | 31 ++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git "a/c(select\354\213\234\355\227\230).c" "b/c(select\354\213\234\355\227\230).c" index 22aac94..3ba4cb6 100644 --- "a/c(select\354\213\234\355\227\230).c" +++ "b/c(select\354\213\234\355\227\230).c" @@ -31,7 +31,7 @@ int board[BOARD_SIZE][BOARD_SIZE]; int bingo[BOARD_SIZE][BOARD_SIZE]; }; -struct MyGame ={0,0,0,0}; +struct Game MyGame ={0,}; //채팅관련 구조체로 묶을변수 @@ -134,7 +134,7 @@ void* send_msg(void* arg) { fgets(msg, BUF_SIZE, stdin); msg[strlen(msg)-1]='\0';//개행문자 제거 //입력받은 msg로 chat내용을 세그먼트화 한다. (채팅-10자리이름(공백으로 줄맞춤)-메세지내용) - sprintf(chat,"%1s%10s%s","N",name,msg); + sprintf(chat,"%1s%10s%2s","N",name,msg); write(sock, chat, strlen(chat)); MyGame.my_turn--; printf("[Debug]writed\n"); @@ -186,7 +186,21 @@ void* recv_msg(void* arg) { } if(msg[0]==78)//N로 시작하는 제어문이 오면 { - if(strcmp(tmpName,"SERV")==0)printf("GET NUMBER!"); + //2자리문자열로 온 숫자를 아스키코드표에 따라 숫자로 변환 + //printf("숫자[%d][%d]",tmpMsg[0],tmpMsg[1]); + int NUM=0; + if(tmpMsg[0]==32){NUM=tmpMsg[1]-48;} + else{NUM=(10*(tmpMsg[0]-48))+tmpMsg[1]-48;} + //printf("받아서 변환된숫자: %d\n",NUM); + for(int i=0; i Date: Tue, 25 May 2021 09:00:31 +0900 Subject: [PATCH 16/17] =?UTF-8?q?Update=20c(select=EC=8B=9C=ED=97=98).c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "c(select\354\213\234\355\227\230).c" | 89 ++++++++++++++++++++------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git "a/c(select\354\213\234\355\227\230).c" "b/c(select\354\213\234\355\227\230).c" index 3ba4cb6..39de1d4 100644 --- "a/c(select\354\213\234\355\227\230).c" +++ "b/c(select\354\213\234\355\227\230).c" @@ -19,14 +19,15 @@ void* game_set(void* arg); void error_handling(char* mse); void game_print(int any); -void chatUI(int s); +int bingo_check(int board[][BOARD_SIZE]); //게임관련 구조체로 묶을 변수 struct Game{ int Game_on; int game_turn; int my_turn; -int my_bingo; +int my_bingo; +int winFlag; //Wflag: 0진행 1패배 2무승부 3승리 int board[BOARD_SIZE][BOARD_SIZE]; int bingo[BOARD_SIZE][BOARD_SIZE]; @@ -119,7 +120,7 @@ void* send_msg(void* arg) { } if(!strcmp(msg, "c\n")||!strcmp(msg,"C\n")) //C를 입력하면 채팅입력창을 출력한다. { - chatUI(1); + printf("type msg: "); fgets(msg, BUF_SIZE, stdin); msg[strlen(msg)-1]='\0';//개행문자 제거 //입력받은 msg로 chat내용을 세그먼트화 한다. (채팅-10자리이름(공백으로 줄맞춤)-메세지내용) @@ -130,7 +131,7 @@ void* send_msg(void* arg) { } if(MyGame.my_turn==1&&!strcmp(msg,"N\n")) //내턴일때 N을 입력하면 숫자를 입력받는다. { - chatUI(1); + printf("NUM:"); fgets(msg, BUF_SIZE, stdin); msg[strlen(msg)-1]='\0';//개행문자 제거 //입력받은 msg로 chat내용을 세그먼트화 한다. (채팅-10자리이름(공백으로 줄맞춤)-메세지내용) @@ -149,6 +150,7 @@ void* send_msg(void* arg) { write(sock, chat, strlen(chat)); printf("[Debug]writed\n"); } + } return NULL; } @@ -156,6 +158,7 @@ void* recv_msg(void* arg) { int sock = *((int*)arg); char msg[BUF_SIZE]; char chat[BUF_SIZE]; + char FLAG[1+NAME_SIZE+BUF_SIZE]; ssize_t str_len; while (1) { @@ -170,6 +173,19 @@ void* recv_msg(void* arg) { } system("clear"); if(strcmp(msg,"GAMEON")==0) MyGame.Game_on=1; + if(msg[0]==87)//W로 시작하는 제어문이 오면 Wflag: 0진행 1패배 2무승부 3승리 + { + if(strcmp(tmpName, name)==0){ + printf("\n승리플래그 메세지 검증%d\n",tmpMsg[0]); + switch (tmpMsg[0]){ + case 48 : MyGame.winFlag=0; break; + case 49 : MyGame.winFlag=1; break; + case 50 : MyGame.winFlag=2; break; + case 51 : MyGame.winFlag=3; break; + default : MyGame.winFlag=-1; break; + } + } + } if(msg[0]==67) //C로 시작하는 채팅내역이오면 { //for(int i=0; i Date: Tue, 25 May 2021 09:00:36 +0900 Subject: [PATCH 17/17] Update s.c --- s.c | 179 +++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 128 insertions(+), 51 deletions(-) diff --git a/s.c b/s.c index 1bbdc68..8ff05c5 100644 --- a/s.c +++ b/s.c @@ -25,14 +25,21 @@ void send_msg(char* msg, int len,int index); int clnt_cnt = 0; int clnt_socks[MAX_CLNT]; int Game_on=0;//게임이 시작되면 1이 되고, 추가 접속을 막는다. 게임이 끝나면 2가 되고, exit한다(쓰레드정리+동적할당정리+main끝) +int win_check =0;//RCV쓰레드와 GM쓰레드가 함 사용하므로 전역변수 + //가장 어려운 세마포를 제어하는 전역변수이다. 클라이언트가 N(숫자)를 입력할때 마다 win_check이 1씩 증가한다. + //하지만 서버쪽에서 실제로는 win_check이 clnt_cnt만큼 증가한다. 클라이언트가 1번 입력하면 AUTO_SendALL을 통해 모든 클라이언트가 그값에 반응을 하기때문이다. + //그러므로 win_check이 clnt_cnt과 같다면 단일 클라이언트가 1번입력한것에 대해 모든 클라이언트가 반응했다는 뜻이다. + //즉 내가 빙고를 완성했을때, 다른 클라이언트도 반응했는지 체크하고, 통신이 원활하게 이루어졌는지 검증할수 있게된다. + struct Clnt{ char IP[16]; int PORT; char NAME[10];//동적할당으로 수정전에 NAME_SIZE를 10으로 임의 - int R;//0은 준비중 1은 준비완료 2는 + int R;//0은 준비중 1은 준비완료 2는 게임중 3은 게임중+ + int Bingo;// }; -struct Clnt C[MAX_CLNT]; -char msgQ[5][NAME_SIZE+BUF_SIZE]; +struct Clnt C[MAX_CLNT]; //what a massive +char msgQ[5][NAME_SIZE+BUF_SIZE]; //SND쓰레드와 RCV쓰레드가 함께 사용하므로 전역변수 pthread_mutex_t mutx; pthread_t t_id; pthread_t t_id2; @@ -100,9 +107,10 @@ void error_handling(char* msg){ exit(1); } -void* handle_clnt(void* arg) { +void* handle_clnt(void* arg) {//클라이언트를 1대1로 담당하는 쓰레드이자, 수신을 담당하는 쓰레드. 이쓰레드에서 사용되는 변수는 전역변수로 설정할지 검증되어야 한다. int clnt_sock = *((int*)arg); int str_len = 0, i; + //int win_check=0; //전역변수로 되었음 char msg[1+NAME_SIZE+BUF_SIZE]; for(int i=0; i1&&C[0].R==1) + char tmp[1+BUF_SIZE+NAME_SIZE]; + //sum으로 R준비여부를 수집하여 연산 + if(clnt_cnt>1&&C[0].R==1&&Game_on==0) { + int sum=0; for(int i=0; i1)//무승부 + { + for(int i=0; i