멀티 쓰레드에서 파일전송을 하는데 전송이 제대로 안됩니다

익명 사용자의 이미지

파일을 전송하는쪽에서 먼저 종료해버려서 버퍼에 데이터가 남아있는상태로 파일을 받는쪽에서 입력을 못받는데 어떻게 하는 방법 없을까요 ??

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);

 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);

추가로 파일 사이즈를 보냈는데 자꾸 이상한 숫자가 뜨는건 왜그런가요 ?

jick의 이미지

send는 버퍼가 모자라면 데이터를 일부만 보낼 수도 있습니다. send의 리턴값을 확인해서 실제로 몇 바이트를 전송했는지 확인해야 합니다.