2008년 11월 16일 일요일

[Linux] TCP Binary File 전송

바이너리 파일 전송은 전송하는 파일의 사이즈가 동일하여야 하는것은 당연한 것이다.
JAVA 라면 알아서 쉽게 해결되겠지만 C의 경우는 가끔 버퍼를 먹어버리거나 손실되는 경우가 발생되기때문에
사이즈를 정확하게 맞추기가 생각보다 까다롭다.( 절대 어렵다는 예기가 아님 ;;)

해당 방식은 서버로부터 파일사이즈를 먼저 받고 그 파일사이즈만큼 받는 방식이다.
상호 지정된 버퍼만큼 들어온다고 가정하고 파일의사이즈 를 루프를 돌면서 들어오는 버퍼의 양만큼 감산한다.
파일의 사이즈가 지정된 버퍼사이즈 보다 적을때는 남은 파일의사이즈 만큼만 받는다.
( 이렇게 하는 이유는 약간씩 오버헤드 또는 쓰레기 값이 들어올수 있게 되기때문에 파일사이즈가 불일치 할 확률이 매우 높아진다. )

server.c 소스

 

  ... 중략 ... 

 fsize = 0, nsize = 0, fpsize = 0;

 file = fopen("test.jpg","rb");

 fseek(file,0,SEEK_END);
 fsize = ftell(file);
 fseek(file,0,SEEK_SET);

 send(sd,&fsize,sizeof(fsize),0); // 파일의 사이즈를 보냄

 while(nsize != fsize){ // 파일을 보냄

  fpsize = fread(buf,1,MAXLINE,file);
  nsize = nsize + fpsize;
  send(sd,buf,fpsize,0);

} // end of while

fclose(file);

client.c 소스

 ... 중략 ...

filesize = 0;

file = fopen("test.jpg","wb");

recv(sd,&filesize,sizeof(filesize),0); // 파일의 사이즈를 받음

  bufsize = MAXLINE; // 기본 버퍼 설정

  while(filesize != 0){ // 받은 버퍼의 총사이즈가 파일의 사이즈와 같을때 까지 loop

      if(filesize < MAXLINE) // 남은 파일 사이즈가 버퍼보다 적을때
           bufsize = filesize;
   
      nbyte = recv(sd,buf,bufsize,0);

      filesize = filesize - nbyte;

      fwrite(buf,sizeof(char),nbyte,file);
      nbyte=0;

  } // end of while

  fclose(file);

댓글 없음:

댓글 쓰기