고수님들....이거 좀 봐주세요...소켓프로그램인데요....ㅠ.ㅠ
글쓴이: k9252 / 작성시간: 목, 2003/05/15 - 9:58오후
============= client.c=======================
#include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF_LEN 255 int main(int argc, char **argv) { int s, len_out; struct sockaddr_in server_addr; char *haddr; char buf[BUF_LEN]; FILE *fp; char line; if (argc != 2) { printf("usage : %s ip_address\n", argv[0]); exit(0); } haddr = argv[1]; if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) { printf("Can't create socket\n"); exit(0); } bzero((char *)&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(haddr); server_addr.sin_port = htons(2049); if (connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { printf("Can't connect.\n"); exit(0); } if ((fp = fopen("test.txt","r")) == NULL) { printf("File open error : "); exit(0); } printf("File open success\n"); if (fgets(buf, BUF_LEN, fp)) { buf[BUF_LEN] = '\0'; len_out = strlen(buf); } else { printf("fgets error\n"); exit(0); } if (write(s, buf, len_out) < 0) { printf("write error\n"); exit(0); } fclose(fp); close(s); }
================server.c=======================
#include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF_LEN 128 int main(int argc, char *argv[]) { struct sockaddr_in server_addr, client_addr; int server_fd, client_fd; int len; char buf[BUF_LEN + 1]; FILE *fp; fp = fopen("receive.txt", "w"); if (fp == NULL) { perror("File write error : "); exit(0); } if (argc != 2) { printf("usage : %s port\n", argv[0]); exit(0); } if ((server_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { printf("Server : Can't open stream socket."); exit(0); } bzero((char *)&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(atoi(argv[1])); if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { printf("Server : Can't bind local address.\n"); exit(0); } listen(server_fd, 5); while(1) { printf("Server : waiting connection request.\n"); len = sizeof(client_addr); client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len); if (client_fd < 0) { printf("Server : accept failed.\n"); exit(0); } printf("Server : A client connected.\n"); fp = read(client_fd, buf, sizeof(buf)); write(client_fd, buf, fp); close(client_fd); } close(server_fd); }
제가 할려고 하는 것은요....
client에서 파일을 읽어서 버퍼에 저장해서
server에 파일을 생성해서 client의 버퍼에 저장되어 있는 내용을 그대로 옮기는 것입니다.
근데 제가 이상하게 짠것인지 잘 안되네요...
에러는 없는데...실행이 안되어서요...소켓프로그램인뎅...
모가 잘 못 되었는지 좀 봐주세요..고수님들.....
아직 C를 시작한지 얼마되지 않아서 잘 몰라요..
Forums:
server.c에서여시스템 콜 read의 return value는 버
server.c에서여
시스템 콜 read의 return value는 버퍼에서 읽은 만큼의 크기 입니다.
시스템콜 open, read, write의 다시 한번 공부하심이...
Re: 고수님들....이거 좀 봐주세요...소켓프로그램인데요....ㅠ.
서버에서 파일을 열때 FILE 포인터를 이용할려고 했으면...
파일에 쓸때는 fwrite 를 이용해야죠...
그리고 read 함수는 읽은 바이트수를 리턴하는데...
그걸 fp 에다가 저장하면 fp가 엉뚱한대를 가리키게 됩니다...
망설이지 말고 해보는거야~
서버 수정.
cli.c
:1. buf[BUF_LEN] = '\0'; 는 의미없음 . fgets는 읽은 버퍼 마지막에 null을 삽입하므로.
srv.c
1. read의 리턴값(읽은 바이트 수)는 write의 세번째 아큐먼트여야함.
2. 마지막 write 함수의 아큐먼트는 아래처럼 바껴야함.
client_fd -> fileno(fp)
fp -> read의
[/code][/b]
\\(^^ )^^)// **
댓글 달기