diff --git a/c.c b/c.c new file mode 100644 index 0000000..c1775b3 --- /dev/null +++ b/c.c @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BOARD_SIZE 5 +#define BUF_SIZE 100 + +void* send_msg(void* arg); +void* recv_msg(void* arg); + +void error_handling(char* mse); //½ÇÇà ¿À·ù °Ë»ç +void game_print(int any); + +int turn_count = 0; +int board[BOARD_SIZE][BOARD_SIZE]; + + +int main(int argc, char* argv[]) +{ + int sock; + struct sockaddr_in serv_addr; + pthread_t snd_thread, rcv_thread, gam_thread; + void* thread_return; + + + + //°ÔÀÓº¸µå ¸ÞÀÌÅ© + + srand(time(NULL)); //½Ã°£À» ÀÎÀÚ·Î Á־ ¿ÏÀüÇÑ ·£´ýÀ» ±¸Çö + int check_number[BOARD_SIZE * BOARD_SIZE] = { 0 }; //Áߺ¹Á¦°Å¿ë ¹è¿­ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + while (1) + { + int temp = rand() % 25; //0~24 ³­¼ö ¹ß»ý + + if (check_number[temp] == 0) //Áߺ¹Á¦°Å ¾Ë°í¸®Áò. 0~24ÀÇ °ªÀ» ¹Þ¾Æ¿À°í, »ç¿ëÇÑ °ªÀº Áߺ¹Á¦°Å¿ë ¹è¿­¿¡ Ç¥½ÃÇØ³õ´Â´Ù. + { + check_number[temp] = 1; + board[i][j] = temp + 1; + break; + } + } + } + } + + + + if (argc != 3) { + printf("ip, Æ÷Æ®¹øÈ£ ¼øÀ¸·Î ÀÔ·Â"); + exit(1); + } + + sock = socket(PF_INET, SOCK_STREAM, 0); + + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family=AF_INET; + serv_addr.sin_addr.s_addr = inet_addr(argv[1]); + serv_addr.sin_port = htons(atoi(argv[2])); + + 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); + pthread_join(rcv_thread, &thread_return); + + close(sock); + return 0; +} + +void* send_msg(void* arg) { + int sock = *((int*)arg); + char msg[BUF_SIZE]; + while (1) { + fgets(msg, BUF_SIZE, stdin); + if (!strcmp(msg, "q\n")||!strcmp(msg,"Q\n")) + { + close(sock); + exit(0); + } + sprintf(msg, "%s", msg); + write(sock, msg, strlen(msg)); + } + return NULL; +} +void* recv_msg(void* arg) { + int sock = *((int*)arg); + char msg[BUF_SIZE]; + int str_len; + while (1) { + str_len = read(sock, msg, BUF_SIZE - 1); + if (str_len == -1) + return (void*)-1; + msg[str_len] = 0; + fputs(msg, stdout); + game_print(0); + } + return NULL; +} + +void error_handling(char* msg) +{ + fputs(msg, stderr); + fputc('\n', stderr); + exit(1); +} + +void game_print(int any) +{ + int i, j; + + system("clear"); //µ¿Àû È¿°ú¸¦ À§ÇÑ È­¸é ÃʱâÈ­ + printf("%c[1;33m", 27); //Å͹̳Π±ÛÀÚ»öÀ» ³ë¶û»öÀ¸·Î º¯°æ + + printf("@------ Ŭ¶ó ºù°íÆÇ ------@\n"); + printf("ÁøÇà Åϼö: %d\n", turn_count++); + printf("+----+----+----+----+----+\n"); + for (i = 0; i < BOARD_SIZE; i++) + { + for (j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] == 0) + { + printf("| "); + printf("%c[1;31m", 27); + printf("%2c ", 88); + printf("%c[1;33m", 27); + } + else + printf("| %2d ", board[i][j]); + } + printf("|\n"); + printf("+----+----+----+----+----+\n"); + } + printf("%c[0m", 27); //Å͹̳Π±ÛÀÚ»öÀ» ¿ø·¡»öÀ¸·Î º¯°æ + if (turn_count != 0) + { + printf("¼ýÀÚ: %d\n", 1); + printf("ºù°í¼ö: %d\n", 1); + } +} \ No newline at end of file diff --git a/s.c b/s.c new file mode 100644 index 0000000..c7d620c --- /dev/null +++ b/s.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define BOARD_SIZE 5 +#define BUF_SIZE 100 +#define BACKLOG 3 //¿¬°á´ë±â Å¥ ¼ýÀÚ +#define MAX_CLNT 256 + +//³×Æ®¿öÅ© ¼±¾ð +void error_handling(char* mse); //½ÇÇà ¿À·ù °Ë»ç +void* handle_clnt(void* arg); +void send_msg(char* msg, int len); //send to all + +int turn[4]; //¾îÇø®ÄÉÀÌ¼Ç ÇÁ·ÎÅäÄÝ Á¤ÀÇ +int clnt_cnt = 0; +int clnt_socks[MAX_CLNT]; +pthread_mutex_t mutx; +pthread_t t_id; + + + +/* + turn[0]=Ç÷¹ÀÌ¾î ¼ýÀÚ¼±Åà + turn[1]=Ŭ¶óÀÌ¾ðÆ® ºù°í ¼ö + turn[2]=¼­¹ö ºù°í ¼ö + turn[3]=°ÔÀÓÁ¾·á¿©ºÎ(0=ÁøÇàÁß, 1=Ŭ¶óÀÌ¾ðÆ® ½Â¸®, 2=¼­¹ö ½Â¸®, 3=¹«½ÂºÎ) +*/ + +int main(int argc, char* argv[]) +{ + int serv_sock, clnt_sock; + struct sockaddr_in serv_adr, clnt_adr; + int clnt_adr_sz; + pthread_t t_id; + if (argc != 2) { + printf("Æ÷Æ®¸¦ ÀÔ·ÂÇϽÿÀ."); + } + pthread_mutex_init(&mutx, NULL); + serv_sock = socket(PF_INET, SOCK_STREAM, 0); + + memset(&serv_adr, 0, sizeof(serv_adr)); //±¸Á¶Ã¼ º¯¼ö °ª ÃʱâÈ­ + serv_adr.sin_family = AF_INET; //IPv4 + serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); //IPÁÖ¼Ò ÇÒ´ç + serv_adr.sin_port = htons(atoi(argv[1])); //Æ÷Æ® ÇÒ´ç + + if (bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == 1) { + error_handling("bind() error"); + } + if (listen(serv_sock, 5) == -1) { + error_handling("listen() error"); + } + printf("º¯¼öÃʱâÈ­,IP,Æ÷Æ®ÇҴ糡, Á¢¼Ó´ë±â"); + 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; + 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ÀÇ ¿¬°á¿äû\n", inet_ntoa(clnt_adr.sin_addr), ntohs(clnt_adr.sin_port)); + printf(".\n"); + } + close(serv_sock); + return 0; +} + +void error_handling(char* msg) +{ + fputs(msg, stderr); + fputc('\n', stderr); + exit(1); +} + +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); + pthread_mutex_lock(&mutx); + for (i = 0; i < clnt_cnt; i++) //eliminated disconnections + { + if (clnt_sock == clnt_socks[i]) + { + while (i++ < clnt_cnt - 1) + clnt_socks[i] = clnt_socks[i + 1]; + break; + } + } + clnt_cnt--; + pthread_mutex_unlock(&mutx); + close(clnt_sock); + return NULL; +} +void send_msg(char* msg, int len) { + int i; + pthread_mutex_lock(&mutx); + for (i = 0; i < clnt_cnt; i++) + write(clnt_socks[i], msg, len); + pthread_mutex_unlock(&mutx); +}