파일전송 만들어봤는데 전송은 되는데 파일 크기가 조금 늘어나네요
글쓴이: ch0nn0m / 작성시간: 목, 2009/07/16 - 11:02오후
리눅스에서 파일전송하는 프로그램을 만들어봣는데...
받고나서 확인해보면 파일크기가 약간 늘어나더라구요...어디가 문제인지..
잘못된부분 지적 부탁드립니다
서버부분입니다
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<arpa/inet.h> #include<sys/types.h> #include<sys/socket.h> #define PORT 8888 #define BUFSIZE 1024 int main(int argc, char **argv) { int serv_sock, clnt_sock,fd,len,str; char filesize[128]; int buf[BUFSIZE]; long total; struct sockaddr_in server; struct sockaddr_in client; int client_size; if(argc !=2 ){ printf("Usage : %s Filename\n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); memset(&server, 0, sizeof(server)); server.sin_family=AF_INET; server.sin_addr.s_addr=htonl(INADDR_ANY); server.sin_port=htons(PORT); if(bind(serv_sock,(struct sockaddr*)&server,sizeof(server))==-1) printf("bind() error\n"); if(listen(serv_sock, 5)==-1) printf("listen() error\n"); client_size=sizeof(client); clnt_sock=accept(serv_sock,(struct sockaddr*)&client,&client_size); printf("New Client Connected, Client IP : %s \n", inet_ntoa(client.sin_addr)); fd=open(argv[1],O_RDONLY,0); total=lseek(fd,0,SEEK_END); printf("Trans File Size %ld \n",total); sprintf(filesize,"%ld",total); write(clnt_sock, filesize, 128); lseek(fd,0,SEEK_SET); while((len = read(fd,buf,BUFSIZE)) > 0 ){ str=send(clnt_sock,buf,BUFSIZE,0); if(str == BUFSIZE) { total-=(long)str; if(total <= 0) { printf("성공적으로 보내기 완료\n"); str=0; break; } else { printf("성공 적으로 보내서 %ld 가 남았음\n",total); continue; } } else if(str < BUFSIZE) { total-=(long)str; if(total <=0) { printf("성공 완료\n"); break; } printf("비 성공적으로 %d 보냇당 그러나 %ld 만큼 남았다\n",len,total); } else if(str==-1); { printf("전송 실패\n"); exit(0); } } close(clnt_sock); close(fd); return 0; }
클라이언트부분입니다
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<arpa/inet.h> #include<sys/types.h> #include<sys/socket.h> #define PORT 8888 #define BUFSIZE 1024 int main(int argc, char **argv) { int sock,fd,str,len; char filesize[128]; int buf[BUFSIZE]; long total; struct sockaddr_in client; if(argc !=2 ){ printf("Usage : %s Filename\n", argv[0]); exit(1); } sock=socket(PF_INET, SOCK_STREAM, 0); memset(&client, 0, sizeof(client)); client.sin_family=AF_INET; client.sin_addr.s_addr=htonl(INADDR_ANY); client.sin_port=htons(PORT); if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) printf("connect() error\n"); fd=open(argv[1],O_CREAT|O_TRUNC|O_WRONLY,0); recv(sock, filesize, 128, 0); total = atol(filesize); printf("전송받을 크기 %ld\n",total); while((len = recv(sock,buf,BUFSIZE,0)) > 0) { str=write(fd,buf,len); if(str == BUFSIZE) { total-=(long)str; if(total <= 0) { printf("성공적으로 받기 완료\n"); str=0; break; } else { printf("성공 적으로 받아서 %ld 가 남았음\n",total); continue; } } else if(str < BUFSIZE) { total-=(long)str; if(total <=0) { printf("성공 완료\n"); break; } printf("비 성공적으로 %d 받았당 그러나 %ld 만큼 남았다\n",len,total); } else if(str==-1); { printf("전송 실패\n"); exit(0); } } close(sock); close(fd); return 0; }
Forums:
아래 소켓 read()질문과 조금 연관되는 듯 하군요.
보내실때 무조건 BUFSIZE만큼 보내고 계신데.
파일 크기가 BUFSIZE에 딱 맞아 떨어지지 않는 경우에는 파일을 읽는 마지막 read에서
len != BUFSIZE입니다. 따라서 마지막 전송은 file data + garbage(BUFSIZE-len크기만큼)
가 전송 되겠죠. 그래서 파일 크기가 아마 커질 듯.
그렇다면...
파일을 전송할때...bufsize만큼 보내는 방법말고는..
어떤 방법들이 있나요..??
아직 시작한지 얼마안돼서 많은 조언 부탁드립니다.
while((len =
여기서 len에 대해서 생각해보시고, read에 관한 질문도 올리셨던데, 거기서 충분한 답변은 받으셨을테고..
str=send(clnt_sock,buf,len,0);
이렇게 변경해보세요
時日也放聲大哭
時日也放聲大哭
댓글 달기