c소켓프로그래밍 으로 학점구하기
글쓴이: 익명 사용자 / 작성시간: 일, 2017/04/02 - 12:31오전
c소켓 프로그래밍으로 학점을 구해야합니다..
클라이언트 쪽에서 각각의 점수를 입력하고
서버쪽에서 그 점수를 받아 평균을 구하고
90점이상이면 A 80점 이상이면 B 이런식으로 하고
그 결과를 다시 클라이언트 쪽으로 보내는 것인데요..
평균도 이상하게 나오고 서버에서 클라이언트 쪽으로 학점이 전송도 되지를 않네요..
무엇이 문제인지 ㅜㅜ
서버측코드:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_SIZE 1024 void error_handling(); int main(int argc, char *argv[]) { int serv_sock, clnt_sock; int korea[BUF_SIZE]; int math[BUF_SIZE]; int english[BUF_SIZE]; float avg; char grade; int str_len, i; int tot; struct sockaddr_in serv_adr; struct sockaddr_in clnt_adr; socklen_t clnt_adr_sz; if (argc != 2) { printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sock = socket(PF_INET, SOCK_STREAM, 0); if (serv_sock == -1) error_handling("socket() error"); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family = AF_INET; serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); 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"); clnt_adr_sz = sizeof(clnt_adr); for (i = 0; i<5; i++) { clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); if (clnt_sock == -1) error_handling("accept() error"); else printf("Connected client %d \n", i + 1); while ((str_len = read(clnt_sock, korea, BUF_SIZE)) != 0) while ((str_len = read(clnt_sock, math, BUF_SIZE)) != 0) while ((str_len = read(clnt_sock, english, BUF_SIZE)) != 0) write(clnt_sock, (char*)&grade, str_len); for (i = 0; i < 1; i++) { tot = korea[i] + math[i] + english[i]; avg = (float)tot / 3.0; printf("avg:%f\n", avg); } if (avg >= 90) { grade = 'A'; printf("A", grade); } else if (avg >= 80) { grade = 'B'; printf("B", grade); } else if (avg >= 70) { grade = 'C'; printf("C", grade); } else if (avg >= 60) { grade = 'D'; printf("D", grade); } else { grade = 'F'; printf("F", grade); } close(clnt_sock); } close(serv_sock); return 0; } void error_handling(char *grade) { fputs(grade, stderr); fputc('\n', stderr); exit(1); }
클라이언트측 코드:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_SIZE 1024 void error_handling(); int main(int argc, char *argv[]) { int sock; int korea[BUF_SIZE]; int math[BUF_SIZE]; int english[BUF_SIZE]; int tot; float avg; char grade; int str_len, i; struct sockaddr_in serv_adr; if (argc != 3) { printf("Usage : %s <IP> <port>\n", argv[0]); exit(1); } sock = socket(PF_INET, SOCK_STREAM, 0); if (sock == -1) error_handling("socket() error"); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family = AF_INET; serv_adr.sin_addr.s_addr = inet_addr(argv[1]); serv_adr.sin_port = htons(atoi(argv[2])); if (connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1) error_handling("connect() error!"); else puts("Connected..........."); { fputs("Input korea (Q to quit): ", stdout); fgets(korea, BUF_SIZE, stdin); write(sock, korea, strlen(korea)); fputs("Input math (Q to quit): ", stdout); fgets(math, BUF_SIZE, stdin); write(sock, math, strlen(math)); fputs("Input english (Q to quit): ", stdout); fgets(english, BUF_SIZE, stdin); write(sock, english, strlen(english)); read(sock,(char*) &grade, BUF_SIZE ); printf("Your grade is :%c\n", grade); } close(sock); return 0; } void error_handling(char *grade) { fputs(grade, stderr); fputc('\n', stderr); exit(1); }
Forums:
#include
#include
#include
#include
#include
#include
#include
이거는 있는상태입니다!
소스코드를 넣을 때에는...
소스코드를 < code > 와 < /code > 사이에 넣어 주셔요.
안 그러면 들여쓰기가 무시되어서 읽기 힘들어요. 답변해주려고 오신 분들이 그냥 갑니다.
세벌 https://sebuls.blogspot.kr/
다시씁니다
서버측 코드
클라이언트 측 코드
서버측
서버측 코드 선언문에 int tot; 는 있습니다 저기에만 빠졋군요
음...
클라이언트에서 점수를 보낼때 한번에 입력해서 구조체에 저장한 뒤에 보내고
서버에서 받은 구조체 점수를 더해서 평균을 낸뒤 다시 보내는게 더 나을거 같다고 생각합니다.
..
그리고 학점을 계산해서 다시 재전송하는 구문이 없네요
댓글 달기