while(1){
puts("서버가 연결요청을 기다림..");
// 연결요청을 기다림
accp_sock = accept(listen_sock,
(struct sockaddr *)&cliaddr, &addrlen);
if(accp_sock < 0){
perror("accept fail");
exit(0);
}
puts("클라이언트가 연결됨..");
inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, cli_ip, sizeof(cli_ip));
printf("IP : %s ", cli_ip);
printf("Port : %x \n", ntohs(cliaddr.sin_port));
memset(filename,0,20);
// bzero(filename, 20);
recv(accp_sock, filename, sizeof(filename), 0);
printf("%s ", filename);
// recv( accp_sock, &filesize, sizeof(filesize), 0 );
read(accp_sock, &filesize, sizeof(filesize));
printf("%d\n", filesize);
strcat(filename, "_backup");
fp = open(filename, O_WRONLY | O_CREAT | O_TRUNC);
while(total != filesize){
sread = recv( accp_sock, buf, 100, 0 );
printf("file is receiving now.. ");
total += sread;
buf[sread] = 0;
write(fp, buf, sread);
memset(buf,0,sizeof(buf));
// bzero(buf, sizeof(buf));
printf("processing : %4.2f%%\n", total*100 / (float)filesize);
usleep(1000);
}
printf( "file traslating is completed\n" );
printf( "filesize : %d, received : %d \n", filesize, total );
chmod(filename, S_IRUSR | S_IWUSR | S_IRGRP);
close(fp);
close(accp_sock);
}
close( listen_sock );
return 0;
}
여기까지 서버고
void filetransfer(int sock){
char filename[30];
char buf[MAXLINE+1];
int filenamesize, fp, filesize;
int sread=0, total = 0;
__fpurge(stdin);
printf("전송할 파일의 이름을 입력하시오 : ");
if (fgets(filename, sizeof(filename), stdin) == NULL)
exit(0);
filenamesize = strlen(filename);
filename[filenamesize-1] = 0;
if((fp = open(filename, O_RDONLY)) < 0 ){
printf( "open failed\n" );
exit(0);
}
send(sock, filename, sizeof(filename), 0);
filesize = lseek(fp, 0, SEEK_END);
send(sock, &filesize, sizeof(filesize), 0);
lseek(fp, 0, SEEK_SET );
while(total != filesize){
sread = read(fp, buf, 100);
printf("파일을 전송하고 있는중입니다.. ");
total += sread;
buf[sread] = 0;
send(sock, buf, sread, 0);
printf("processing :%4.2f%% \n", total*100 / (float)filesize);
usleep(10000);
}
printf("전송이 완료되었습니다.\n");
printf("크기 : %d, 완료율 : %d \n", filesize, total);
close(sock);
close(fp);
}
여기까지 클라이언트임
근데 파일을 전송시키면 10바이트가 증가되어서 보내지고
클라이언트는 processing이 100%까지 잘 뜨는데
서버부분에서 processing부분이 한 9%에서 무한루프가 걸림 왜 그런건지 알 수 있을까
소스 너무 길어서 서버 연결부분이랑은 잘라낸거임 연결은 잘 되니까
메일이나 뭐 알려주면 나머지 소스도 보내줄 수 있어
2학기에 뭔 네트웍 과목이 많은지 올라온거 또 올라오고 ㅠㅠ 이것도 참고 소스 많을텐데
크기 계산이 틀렸든지, 비동기 처리를 잘못했든지~
크기계산은 제대로 하는데 전송과정에서 10바이트씩 늘어나는데 뭐가 문제인지 ㅠㅠ
참고소스랑 비교대조해봐도 다른게 없는데....
계속 파일 상단에 이상한 문자열 3개나 4개가 추가되네요
클라에서 파일 읽을때 "rb" 로 읽음?
fopen 으로 읽어봐 open 쓰지 말구.
rb가 뭐에요?
기본 binary 여야함. 순수 open 으로 파일 연건 몇 만년 전이다.
read binary
binary 옵션 안주면 개행코드같은게 줄줄 늘어남.
아.. 그럼 fopen으로 해볼게요 일단
원칙적으론 open 으로 열어 read 로 읽는 경우 문제가 없어야하지만, 니 소스코드를 다 안읽고 있음 귀찮아서
글구 성능을 위해서도 어지간히 지가 튜닝할수 있지 않으면 fopen fread fclose fseek 를 쓰는게 API 를 쓰는거 보다 나음.
fopen으로 바꾸려면 거의 갈아엎어야겠네용
그리고 total != filesize 이것도 예쁜 코드가 아닌디.
EOF 처리 할때 걸기적거릴수 있음.
이런건 좀 깔끔한 코드 기반으로 갖다써... 이거 좀 개판인듯
http://type2000.tistory.com/2255
여기꺼밖에 못찾아가지구요...
리눅스에서는 기본으로 rb로 연다고 하는데요
원칙적으론 open 으로 열어 read 로 읽는 경우 문제가 없어야하지만, 니 소스코드를 다 안읽고 있음 귀찮아서 <---
그럼 usleep 쪽이 문제거나~
코드 대충 보니 말은 되게 짜여져 있긴한데
클라가 전송을 완료하면 서버는 progress 퍼센테이지가 멈추고 무한루프가 문제인데
codesafer//짜여져->짜여 (이중 피동) [리듬 맞춤법 봇♬]
ㅇㅇ//뭐에요->뭐예요 (받침 있으면 이에요 없으면 예요 이로 끝나면 받침 없으므로 예요 요 떼서 말 되면 에요 아니에요는 예외 인명엔 예요(예 : 길동이예요) 성까지 쓰면 이에요(예 : 홍길동이에요)) [리듬 맞춤법 봇♬]
와 usleep쪽 건들였더니 바로 되네요
진짜 감사합니다.
정말정말정말정말 감사합니다
ㅋㅋㅋㅋ 근데 예쁜 코드가 아니라 별로 보고 싶지 않았음.
괜찮아요 ㅠㅠㅠㅠ 무한루프 풀린게 중요한거지
저기서 코파고 있는 sh 가 나쁜 녀석이영.
지 메인 분야인데다가 컴파일 / 테스트 환경도 다 있으면서 코파고 있음.
뭐가 중요해요 그런게
좀만 더 있으면 자살하려고했는데