Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <pthread.h>

#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);
}
}
115 changes: 115 additions & 0 deletions s.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#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);
}