디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

질문)인터넷 소켓통신 문제

프갤러(125.133) 2024.12.09 00:52:18
조회 84 추천 0 댓글 2

server.c 와 client.c로 만들고 있습니다
다만 client.c로 입력을 할때마다 송신이 안됩니다.
이게 진짜 이상한게 어떨때는 2번째 턴에 안되고 어떨때는 3번쨰 턴에 안되는데
chatgpt한테 물어봐도 어떻게 안되더라구요
혹시 어떻게 해야 하는지 아시나요...?


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <sys/socket.h>


#define PORT 8888

#define SIZE 3

#define BUFFER_SIZE 1024


void print_board(char tic[3][3], int client_socket) {

    char message[BUFFER_SIZE];

    sprintf(message, "| %c | %c | %c |\n---------------\n| %c | %c | %c |\n---------------\n| %c | %c | %c |\n",

            tic[0][0], tic[0][1], tic[0][2], tic[1][0], tic[1][1], tic[1][2], tic[2][0], tic[2][1], tic[2][2]);

    send(client_socket, message, strlen(message), 0);

}


int check_win(char tic[3][3], char mark) {

    for (int i = 0; i < SIZE; i++) {

        if ((tic[i][0] == mark && tic[i][1] == mark && tic[i][2] == mark) || 

            (tic[0][i] == mark && tic[1][i] == mark && tic[2][i] == mark)) {

            return 1;

        }

    }

    if ((tic[0][0] == mark && tic[1][1] == mark && tic[2][2] == mark) ||

        (tic[0][2] == mark && tic[1][1] == mark && tic[2][0] == mark)) {

        return 1;

    }

    return 0;

}


int main() {

    int server_fd, client_socket;

    struct sockaddr_in address;

    int opt = 1;

    int addrlen = sizeof(address);

    int a, b;

    char tic[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};

    char buffer[BUFFER_SIZE];


    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

        perror("소켓 생성 실패");

        exit(EXIT_FAILURE);

    }


    printf("ip와 port 바인딩\n");

    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));


    address.sin_family = AF_INET;

    address.sin_addr.s_addr = INADDR_ANY;

    address.sin_port = htons(PORT);


    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {

        perror("바인딩 실패");

        exit(EXIT_FAILURE);

    }

    printf("리스닝 시작\n");


    if (listen(server_fd, 3) < 0) {

        perror("리스닝 실패");

        exit(EXIT_FAILURE);

    }


    printf("서버가 시작되었습니다. 포트 %d에서 대기 중...\n", PORT);

    while (1) {

        if ((client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {

            perror("연결 수락 실패");

            exit(EXIT_FAILURE);

        }


        printf("클라이언트와 연결되었습니다.\n");


        while (1) {

            print_board(tic, client_socket);

            send(client_socket, "어디에 찍을래? ex) 1 3\n", strlen("어디에 찍을래? ex) 1 3\n"), 0);


            int bytes_received = recv(client_socket, buffer, sizeof(buffer) - 1, 0);

            if (bytes_received <= 0) {

                perror("클라이언트 입력 수신 실패");

                break;

            }

            buffer[bytes_received] = '\0';

            printf("수신된 데이터: %s\n", buffer);  // 수신된 데이터 출력


            sscanf(buffer, "%d %d", &a, &b);


            if (a < 1 || a > SIZE || b < 1 || b > SIZE) {

                send(client_socket, "1 ~ 3인 숫자를 입력하세요\n", strlen("1 ~ 3인 숫자를 입력하세요\n"), 0);

                continue;

            }


            a--; b--;


            if (tic[a][b] != ' ') {

                send(client_socket, "이미 선택된 자리입니다.\n", strlen("이미 선택된 자리입니다.\n"), 0);

                continue;

            }


            tic[a][b] = 'X';

            print_board(tic, client_socket);


            if (check_win(tic, 'X')) {

                send(client_socket, "X가 이김\n", strlen("X가 이김\n"), 0);

                break;

            }


            if (tic[0][0] != ' ' && tic[0][1] != ' ' && tic[0][2] != ' ' &&

                tic[1][0] != ' ' && tic[1][1] != ' ' && tic[1][2] != ' ' &&

                tic[2][0] != ' ' && tic[2][1] != ' ' && tic[2][2] != ' ') {

                send(client_socket, "무승부임\n", strlen("무승부임\n"), 0);

                break;

            }


            // O의 차례

            print_board(tic, client_socket);

            send(client_socket, "어디에 찍을래? ex) 1 3\n", strlen("어디에 찍을래? ex) 1 3\n"), 0);


            bytes_received = recv(client_socket, buffer, sizeof(buffer) - 1, 0);

            if (bytes_received <= 0) {

                perror("클라이언트 입력 수신 실패");

                break;

            }

            buffer[bytes_received] = '\0';

            printf("수신된 데이터: %s\n", buffer);  // 수신된 데이터 출력


            sscanf(buffer, "%d %d", &a, &b);


            if (a < 1 || a > SIZE || b < 1 || b > SIZE) {

                send(client_socket, "1 ~ 3인 숫자를 입력하세요\n", strlen("1 ~ 3인 숫자를 입력하세요\n"), 0);

                continue;

            }


            a--; b--;


            if (tic[a][b] != ' ') {

                send(client_socket, "이미 선택된 자리입니다.\n", strlen("이미 선택된 자리입니다.\n"), 0);

                continue;

            }


            tic[a][b] = 'O';

            print_board(tic, client_socket);


            if (check_win(tic, 'O')) {

                send(client_socket, "O가 이김\n", strlen("O가 이김\n"), 0);

                break;

            }


            if (tic[0][0] != ' ' && tic[0][1] != ' ' && tic[0][2] != ' ' &&

                tic[1][0] != ' ' && tic[1][1] != ' ' && tic[1][2] != ' ' &&

                tic[2][0] != ' ' && tic[2][1] != ' ' && tic[2][2] != ' ') {

                send(client_socket, "무승부임\n", strlen("무승부임\n"), 0);

                break;

            }

        }


        close(client_socket);

    }


    close(server_fd);

    return 0;

}

위에게 server코드고
밑에게 client코드입니다...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8888
#define BUFFER_SIZE 1024

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[BUFFER_SIZE] = {0};

    printf("소켓 생성\n");
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("소켓 생성 실패\n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    printf("유효한 주소\n");
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("유효하지 않은 주소\n");
        return -1;
    }

    printf("연결 시작\n");
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("연결 실패\n");
        return -1;
    }

    while (1) {
        int valread = read(sock, buffer, sizeof(buffer) - 1);
        if (valread <= 0) {
            printf("서버와의 연결이 끊어졌습니다.\n");
            break;
        }
        buffer[valread] = '\0';
        printf("%s", buffer);  // 현재 보드 출력

        fgets(buffer, sizeof(buffer), stdin);  // 사용자 입력 받기
        buffer[strcspn(buffer, "\n")] = 0;  // 개행 문자 제거

        send(sock, buffer, strlen(buffer), 0);
        printf("서버로 전송된 좌표: %s\n", buffer);  // 전송된 데이터 확인

        valread = read(sock, buffer, sizeof(buffer) - 1);
        if (valread <= 0) {
            printf("서버와의 연결이 끊어졌습니다.\n");
            break;
        }
        buffer[valread] = '\0';
        printf("%s", buffer);  // 승리 또는 무승부 메시지 출력

        if (strstr(buffer, "이김") != NULL || strstr(buffer, "무승부") != NULL) {
            break;
        }
    }

    close(sock);
    return 0;
}





추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 나라가 위기에 처하면 가장 먼저 나설 것 같은 스타는? 운영자 24/12/09 - -
2783822 국비교육 중에 인턴쉽 포함된 것들도 있던데 프갤러(182.228) 12.10 43 0
2783820 타일맵 엔진보니까 나도 더 열심히 해야겠노. [3] ㅆㅇㅆ(124.216) 12.10 67 0
2783819 아 피곤해- 프갤러(121.172) 12.10 42 0
2783818 하아 프붕이 2주동안 몸비틀면서만든 타일맵엔진봐줘 [10] Synoeca갤로그로 이동합니다. 12.10 79 1
2783815 미국 ” 윤석열 대통령 종북내란당의 억지탄핵 반대 “ ♥사랑가득냥덩이♥갤로그로 이동합니다. 12.10 41 0
2783813 조갓노 [2] 골방외톨이갤로그로 이동합니다. 12.10 44 0
2783811 근데 확실히 옛날에 비해서 코딩 머리 쓰는 일이 적어짐 GPT쓰니까 ㅆㅇㅆ(124.216) 12.10 51 0
2783810 이직했는데 버티기 쉽지 않을듯 싶다... [3] 프갤러(211.234) 12.10 121 0
2783809 개발자 취준 조언좀 [2] 프갤러(121.162) 12.10 153 0
2783807 일단 엔화에 정찰병을 보내 [2] 공기역학갤로그로 이동합니다. 12.10 50 0
2783805 코딩밸리 들을만함? [1] ㅇㄹㅇ갤로그로 이동합니다. 12.10 36 0
2783804 개발 기한이 없음 [4] ㅇㅇ(211.234) 12.10 67 0
2783800 젊어서야 이직하고 진로틀고 한다지만 [2] 프갤러(61.43) 12.10 91 0
2783795 비개발전산 미래없지않냐? [20] 프갤러(61.43) 12.10 145 0
2783794 필요하다면 언제든 신기술 도입 ♥사랑가득냥덩이♥갤로그로 이동합니다. 12.10 44 0
2783793 나는 지금도 코딩을 하고 있다...25분씩 코딩 꾸준히 한다... [1] ㅆㅇㅆ(124.216) 12.10 57 0
2783785 국비 취준하다가 멘붕+ 번아웃 와서 3개월 폐인처럼 지냄 [4] ㅇㅇ(61.74) 12.10 152 0
2783782 문재인과 클리앙 딴지가 띄운 bts 그런데 기괴하고 소름돋는부분 [1] ㅇㅇ(211.235) 12.10 54 0
2783780 건물도 모듈식 공법으로 짓는다는데 게임도 모듈식으로 만들 수 있었으면 [5] ㅆㅇㅆ(124.216) 12.10 73 0
2783778 프갤에서 정치 이야기 금지 ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 12.10 51 0
2783777 비둘기 요즘 겁을 상실해서 아예 길막을하네 [7] 헬마스터갤로그로 이동합니다. 12.10 75 0
2783776 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 12.10 49 0
2783774 스탑럴커 아기사슴❤+ ♥사랑가득냥덩이♥갤로그로 이동합니다. 12.10 40 0
2783772 종북내란세력이 부정선거조작에 침묵하는 이유 ♥사랑가득냥덩이♥갤로그로 이동합니다. 12.10 39 0
2783770 오늘도 신문 다 읽었으니 즐거운 코딩해야지 [1] ㅆㅇㅆ(124.216) 12.10 51 0
2783769 좆소생산직 vs 좆소개발자 [1] 도스터쿠션갤로그로 이동합니다. 12.10 90 0
2783768 일본은 어디까지 성장할까 [4] 공기역학갤로그로 이동합니다. 12.10 78 0
2783766 ❤✨☀⭐나님 시작합니당⭐☀✨❤ ♥사랑가득냥덩이♥갤로그로 이동합니다. 12.10 36 0
2783765 가끔보면 프갤 보수라고하는 애들보면 갑갑함. ㅆㅇㅆ(124.216) 12.10 119 2
2783760 디시에서 칭찬받고 싶어하는 애들 이유를 보니까 알거같긴함 ㅆㅇㅆ(124.216) 12.10 43 0
2783759 22세 무자본 유저인데 지금 시작해도 인생게임 할만한가요?? [2] ㅇㅇ(123.213) 12.10 76 1
2783758 사실 대부분의 갈등은 계급 갈등이다... ㅆㅇㅆ(124.216) 12.10 36 0
2783754 음기 충전 발명도둑잡기갤로그로 이동합니다. 12.10 60 0
2783749 게임은 기획이 제일 중요하다는 건 내가 제일 잘 알어.. ㅆㅇㅆ(124.216) 12.10 62 0
2783743 안녕하세요...뉴비입니다.. 프갤러(118.235) 12.10 38 0
2783736 모서리 끌어서 겜해상도바꾸는게 진쟈엄청난기능이엇네 [8] Synoeca갤로그로 이동합니다. 12.10 91 0
2783734 대학 때 전산과 교수님이 하신 말 기억나는 것 [1] 발명도둑잡기갤로그로 이동합니다. 12.10 91 0
2783731 내란 옹호자가 많다 발명도둑잡기갤로그로 이동합니다. 12.10 44 1
2783727 웹 개발 공부하고싶으면 어떻게 함? [1] ㅇㅇ갤로그로 이동합니다. 12.10 98 0
2783716 윤석열 지지율 11% 역대 최저 나왔다 발명도둑잡기갤로그로 이동합니다. 12.10 44 0
2783713 익명으로 작성된 글 익명사용자(121.173) 12.10 33 0
2783712 윤석열 탄핵 시민 촛불 대학생 자원봉사자 모집 발명도둑잡기갤로그로 이동합니다. 12.10 35 0
2783710 나의 희망연봉은 47억 7천만원임 뒷통수한방(1.213) 12.10 48 0
2783707 현실은 인터넷하고 다르다는새끼 특 ) 뒷통수한방(1.213) 12.10 57 0
2783705 2017년 윤석열 빨던 클리앙 분위기 윤석열 비판하면 매장당했음 ㅇㅇ(211.235) 12.10 62 0
2783702 나는 바보로소이다... [6] cvs.갤로그로 이동합니다. 12.10 70 0
2783697 AI로 생산직 단순작업 대체는 언제됨? [3] ㅇㅇ(175.116) 12.10 94 0
2783695 서비스 기업은 당직 있음?? ㅇㅇ갤로그로 이동합니다. 12.10 34 0
2783694 갤럭시북 윈도우10, 11 ARM 발명도둑잡기갤로그로 이동합니다. 12.10 153 0
2783693 유니티말고 일반적인겜 클뜯으로 사진은 어캐 추출해? ㅇㅇ(112.152) 12.10 23 0
뉴스 [포토] 정유미, 해맑은 미소로 입장 디시트렌드 12.13
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2