[소켓프로그래밍] C언어 공부중에 막혀서 질문 드립니다. (남은 용량 구하기)
글쓴이: 맙소사 / 작성시간: 수, 2012/10/03 - 11:57오전
안녕하세요.
엔지니어 일을 하다가 한계가 느껴져서 뒤늦게 C언어 공부를 시작한 초보 입니다.
좋지 않은 머리로 혼자 공부하려니 매우 힘드네요.
지금 제가 만들고 있는건, 리눅스 vi에서 코딩하고 gcc로 컴파일 하고 있습니다.
- 5대의 서버에서 각각의 잔여 용량을 구하고, 용량이 많아 있는 것을 선택한 후 클라이언트에게 IP와 용량 정보를 전달해 준다.
이런 프로그램을 만들고 있습니다. 책에 나와있는 소스에다가 인터넷에서 따온 소스를 더했는데, 제대로 작동하지를 않습니다.
각각 문법상, 기능상 전혀 문제없는 소스와 함수였는데, 껴넣어버리니 문제가 생겨버리네요..;;
기초가 많이 부족해서 어느 부분부터 손을 봐야할지 통 모르겠습니다.
약간의 조언과 방향을 지적해 주시면 해결책을 찾는데 있어서 큰 도움이 될것 같습니다. 감사합니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/statvfs.h> #include <glib.h> void error_handling(char *message); gchar * g_get_capacity (gchar * dev_path); // 전체 용량 확인 (dev_path: 구할 용량의 경로) gchar * g_get_free_space (gchar * dev_path); // 남은 용량 확인 int main(int argc, char **argv) { //소켓 생성 및 연결 정보 int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size; char message[]="116.120.058.130\n"; 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_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(argv[1])); // 소켓 바인드 함수 if( bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 ) error_handling("bind() error"); // 클라이언트 연결 대기 if( listen(serv_sock, 5)==-1 ) error_handling("listen() error"); clnt_addr_size=sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size); if(clnt_sock==-1) error_handling("accept() error"); unsigned long long result =0; int n; gchar s_cap[50]; gchar * ss_cap = "N/A"; struct statvfs sfs; if (ststvfs (dev_path, &sfs) != -1) { result=(unsigned long long)sfs.f_bsize * sfs.f_blocks; } if (result > 0) { double f_cap = (double)result/(1024*1024); n = sprintf(s_cap, "%.2f Mb", f_cap); ss_cap = g_strdup (s_cap); } return ss_cap; write(clnt_sock, message, sizeof(message)); close(clnt_sock); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
Forums:
댓글 달기