2010-12-28 3 views
0

사실 저는 매우 간단한 FTP 서버에서 작업하고 있습니다. 이제 파일 보내기 (FTP 프로토콜에서 RETR) 문제가 있습니다. 클라이언트에서 소켓과 바이너리 모드를 사용하고 있습니다. 텍스트가있는 파일은 완벽하게 전송되지만 문제는 바이너리 파일 (이미지 등)입니다.소켓이 모든 이진 데이터를 보내지 않습니다.

여기에 내 코드 조각입니다 :

URL이없이 일 경우이 화면 이미지에서 볼 수 있기 때문에 내 FTP 클라이언트, (나는 비교 메모장 파일을 열) 내부의 차이가 완료되지 않은 파일을 받고있다
FILE *fin=fopen(fileloc,"rb"); 

if(fin != NULL){ 
    fpos_t filelen; 

    fseek (fin, 0, SEEK_END); 
    fgetpos (fin, &filelen); 

    fseek (fin, 0, SEEK_SET); 
    printf("Sending file %s (%d b)", fileloc, filelen); 
    sprintf(sbuffer,"150 Opening BINARY mode data connection for file transfer.\r\n"); 
    bytes = send(ns, sbuffer, strlen(sbuffer), 0); 
    byte temp_buffer[512]; 

    long int totalsent; 
    totalsent = 0; 

    while (!feof(fin)){ 

     memset(temp_buffer, '\0', sizeof(sbuffer)); 

     fgets((char *)temp_buffer, sizeof(sbuffer), fin); 

     if (!active) bytes = send(ns_data, (char *)temp_buffer, strlen(sbuffer), 0); 
     else bytes = send(s_data_act, (char *)temp_buffer, strlen(sbuffer), 0); 

     totalsent = totalsent + bytes; 

     printf("  file size = %d, send = %d bytes, strlen = %d, total = %d, left = %d\n", 
       filelen, bytes, strlen(sbuffer), totalsent, filelen-totalsent); 
     } 

    fclose(fin); 
    sprintf(sbuffer,"250 File transfer completed... \r\n"); 
    bytes = send(ns, sbuffer, strlen(sbuffer), 0); 
} 

표시를-의 요구 : 또한 파일 크기에 차이가있다

http://i53.tinypic.com/2wcjtdk.jpg

- 원본 파일은 7 KB에 관한 것입니다 및 전송 사본 적은 1KB에 관한 것입니다. 나는 많은 다른 FTP 클라이언트를 사용했고 같은 문제가있다.

답변

5

당신의 전화를 걸면 텍스트 데이터에는 잘 작동하지만 바이너리 데이터에는 적합하지 않은 strlen을 사용하고 있습니다. 파일에서 읽을 때 당신은 실제로 얼마나 많은 바이트가 읽혀 졌는지 알려주는 read와 같은 호출을 사용할 필요가있다. 그래서 당신은 send 호출에서 그 많은 바이트를 보낼 수있다.

+0

명확히하기 : 본질적으로 fgets와 strlen을 사용할 때의 문제는 null 바이트가 문자열을 종료하는 데 사용되므로 이진 파일에서 모든 null 바이트를 잃어 버리는 것입니다. 그것은 일반적으로 null 바이트를 포함하지 않기 때문에 텍스트 파일에 대해 잘 작동합니다. – PleaseStand

+0

여러분 께 감사드립니다. 방금 팁을 주셔서 감사합니다. – Bury

관련 문제