파일 전송 프로그램 1:1 [리눅스 용] 만들어 봤는데 조언 부탁드
글쓴이: skylandi / 작성시간: 토, 2003/03/22 - 2:32오전
넘 허접하게 만들엇는데(테스트 상 ㅠㅠ)
조언 좀 얻고자 이케 글을 올립니다.
파일을 주고 받을때 전송할때 사이즈는 대략 얼마로 해야 할지 모르겟습니다. 남은 시간 구하는 방법도 갈켜 주시면 감사 드리겟습니다.
좋은 하루 되시길...
서버입니다.
#include <stdio.h> #include <sys/types.h> #include <netinet/in.h> #include <fcntl.h> #include <sys/socket.h> #include <netdb.h> #define MAXSIZE 2048 int main(int argc,char *argv[]) { struct sockaddr_in server,client; int sd,client_len,len,fd,newsd; char buf[MAXSIZE]; off_t offset; long total; if(argc !=2) { printf("사용법 %s 전송할파일이름\n",argv[0]); exit(0); } if((sd=socket(PF_INET,SOCK_STREAM,0)) < 0) { printf("소켓 개설 실패\n"); exit(1); } bzero((char *)&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(4001); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sd,(struct sockaddr *)&server,sizeof(server)) < 0) { printf("bind error\n"); exit(0); } listen(sd,5); client_len=sizeof(client); newsd=accept(sd,(struct sockaddr *)&client,&client_len); fd=open(argv[1],O_RDONLY,0); // 파일 이름 argv[1] total=lseek(fd,0,SEEK_END); // 전송할 파일 크기 printf("전송할 파일 크기 %ld \n",total); sprintf(buf,"%ld",total); send(newsd,buf,MAXSIZE,0); lseek(fd,0,SEEK_SET); while((len=read(fd,buf,MAXSIZE)) > 0) { len=send(newsd,buf,len,0); if(len == MAXSIZE) { total-=(long)len; if(total <= 0) { printf("성공적으로 보내기 완료\n"); len=0; break; } else { // printf("성공 적으로 보내서 %ld 가 남았음\n",total); continue; } } else if(len < MAXSIZE) { total-=(long)len; if(total <= 0) { printf("성공 완료\n"); break; } printf("비 성공적으로 %d 보냇당 그러나 %ld 만큼 남았다\n",len,total); } else if(len == -1) { printf("전송 실패\n"); exit(0); } } close(sd); close(fd); return 0; }
클라이언트 입니다.
#include <stdio.h> #include <sys/types.h> #include <netinet/in.h> #include <fcntl.h> #include <sys/socket.h> #include <netdb.h> #define MAXSIZE 2048 int main(int argc,char *argv[]) { struct sockaddr_in client; int sd,len,fd; char buf[MAXSIZE]; long total; char a; if(argc !=2) { printf("사용법 %s 받을 이름\n",argv[0]); exit(0); } if((sd=socket(PF_INET,SOCK_STREAM,0)) < 0) { printf("소켓 개설 실패\n"); exit(1); } bzero((char *)&client,sizeof(client)); client.sin_family=AF_INET; client.sin_port=htons(4001); client.sin_addr.s_addr=htonl(INADDR_ANY); if(connect(sd,(struct sockaddr *)&client,sizeof(client)) < 0) { printf("error\n"); exit(0); } fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0644); // 파일 이름 argv[1] recv(sd,buf,MAXSIZE,0); total=atol(buf); printf("전송 받을 크기%ld\n",total); while((len=recv(sd,buf,MAXSIZE,0)) > 0) { len=write(fd,buf,len); if(len == MAXSIZE) { total-=(long)len; continue; // printf("성공 적으로 받아와서 %ld 가 남았음\n",total); } else if(len < MAXSIZE) { total-=(long)len; if(total <= 0) { printf("성공 완료\n"); break; } printf("비 성공적으로 %d 받아왓당 그러나 %ld 만큼 남았다\n",len,total); } else if(len == -1) { printf("전송 실패\n"); exit(0); } } close(sd); close(fd); return 0; }
맘고생 많이 하는 새벽에 ㅜㅜ
Forums:
음냐..
최근에 패치서버를 만든적이 있었는데..
머 아시겠지만.. 주고 받는 패킷에 보내는 패킷의 크기를 같이 보내는 방법이 이용합니다. 받을때 그 크기를 보고 받게 되죠..
주고 받는 패킷의 크기가 자유롭게 변해두 잘 받고 보내진다면..
이걸 이용해서... 패킷의 크기를 바꿔보는거죠.
현재 패킷 크기일때 총패킷수를 구해서 거기에 루프를 한번 도는 시간을 곱하는 방법으로 전체 보내는 시간을 계산합니다.
글구.. 패킷 크기를 변화시켜 보면서 계산을 계속해 보는거죠..
머.. 그러면서 계속 시간을 비교해 보시면 되지 않을까 싶네요..
머 어떻게 변화시키는가 하는건 머 사람마다 다르겠죠.. ^^;
파일이 아주 크고.. 주고 받는 거리가 멀다면 모를까.. 로컬에서는 별차이가 없었다는.. 쿨럭~
하여간 허접데기 생각이었습니다..
아.. 쓰는김에.. TCP/IP에서 항상 정확히 간다고 알고는 있지만 항상 그렇지도 않은것 같네요.. T^T
댓글 달기