소켓프로그래밍 오류나는거 질문합니다ㅜㅜ

조회수 383회

송신/수신되는 구조체에 2개 필드 "번호","이름" 를 추가하고 클라이언트가 입력받아 서버로 송수신,

송신/수신되고 있는 데이터를 수업시간에 보여준 형식(16진수)으로 출력해야 하는데요

예시 :1 2 + 00 00 00 01 00 00 00 02 2b 00 00 00 00 00 00 00 00

16진수로 출력하는 것은 아예 시도를 못했고 번호 이름 받는것도 잘 안되네요ㅜㅜ

  1. cal_server.c 코드 #include #include #include #include

include

include

include

include

include

define PORT 3600

struct cal_data { int left_num; int right_num; char op; char id[20]; char name[20]; int result; short int error; };

int main(int argc, char **argv) { struct sockaddr_in client_addr, sock_addr; int listen_sockfd, client_sockfd; int addr_len; struct cal_data rdata; int left_num, right_num, cal_result; short int cal_error;

    if( (listen_sockfd  = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
            perror("Error ");
            return 1;
    }

    memset((void *)&sock_addr, 0x00, sizeof(sock_addr));
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    sock_addr.sin_port = htons(PORT);

    if( bind(listen_sockfd, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) == -1)
    {
            perror("Error ");
            return 1;
                                                                                                                                      }

    if(listen(listen_sockfd, 5) == -1)
    {
            perror("Error ");
            return 1;
    }

    for(;;)
    {
            addr_len = sizeof(client_addr);
            client_sockfd = accept(listen_sockfd,
                    (struct sockaddr *)&client_addr, &addr_len);
            if(client_sockfd == -1)
            {
                    perror("Error ");
                    return 1;
            }

printf("New Client Connect : %s\n", inet_ntoa(client_addr.sin_addr));

            read(client_sockfd, (void *)&rdata, sizeof(rdata));

            cal_result = 0;
            cal_error = 0;

            left_num = ntohl(rdata.left_num);
            right_num = ntohl(rdata.right_num);

            switch(rdata.op)
            {
                    case '+':
                            cal_result = left_num + right_num;
                            break;
                    case '-':
                            cal_result = left_num  - right_num;
                            break;
                    case '*':
                            cal_result = left_num * right_num;
                            break;
                    case '/':
                            if(right_num == 0)
                            {
                                    cal_error = 2;
                                    break;
                            }
                            cal_result = left_num / right_num;
                            break;
                    default:
                                                                                                               cal_error = 1;

            }
            printf("%d %d %d = %d", left_num, rdata.op, right_num, rdata.result);

            rdata.result = htonl(cal_result);
            rdata.error = htons(cal_error);
            write(client_sockfd, (void *)&rdata, sizeof(rdata));
            close(client_sockfd);
    }

    close(listen_sockfd);
    return 0;

}

  1. cal_client.c #include #include #include #include

include

include

include

include

include

define PORT 3600

define IP "127.0.0.1"

struct cal_data { int left_num; int right_num; char op; char id[20]; char name[20]; int result; short int error; };

int main(int argc, char **argv) { struct sockaddr_in addr; int s; int len; int sbyte, rbyte; struct cal_data sdata;

memset((void *)&sdata, 0x00, sizeof(sdata));

sdata.left_num = atoi(argv[1]);
sdata.right_num = atoi(argv[2]);
sdata.op = argv[3][0];
strcpy(sdata.id,argv[4]);
strcpy(sdata.name,argv[5]);

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == -1)
{
     return 1;
}

addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);

if ( connect(s, (struct sockaddr *)&addr, sizeof(addr)) == -1 )
{
     printf("fail to connect\n");
     close(s);
     return 1;
}

len = sizeof(sdata);
sdata.left_num = htonl(sdata.left_num);
sdata.right_num = htonl(sdata.right_num);

sbyte = write(s, (char *)&sdata, len);
if(sbyte != len)
{
     return 1;
}

rbyte = read(s, (char *)&sdata, len);
if(rbyte != len)
{
     return 1;
}
if (ntohs(sdata.error != 0))
{
     printf("CALC Error %d\n", ntohs(sdata.error));
}
printf("%s %s\n", sdata.id, sdata.name);
printf("%d %c %d = %d\n", ntohl(sdata.left_num), sdata.op, ntohl(sdata.right_num), ntohl(sdata.result));

close(s);
return 0;

} 결과로 CALC ERROR가 뜨는데 어디서부터 어떻게 고쳐야할지 모르겠어서 도움 부탁드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)