소켓프로그래밍 오류나는거 질문합니다ㅜㅜ
조회수 383회
송신/수신되는 구조체에 2개 필드 "번호","이름" 를 추가하고 클라이언트가 입력받아 서버로 송수신,
송신/수신되고 있는 데이터를 수업시간에 보여준 형식(16진수)으로 출력해야 하는데요
예시 :1 2 + 00 00 00 01 00 00 00 02 2b 00 00 00 00 00 00 00 00
16진수로 출력하는 것은 아예 시도를 못했고 번호 이름 받는것도 잘 안되네요ㅜㅜ
- 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;
}
- 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가 뜨는데 어디서부터 어떻게 고쳐야할지 모르겠어서 도움 부탁드립니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력