2010-12-28 12 views
0

私は非常に単純なFTPサーバーで作業しています。 ファイルを送信する際に問題が発生しました(FTPプロトコルでのRETR)。クライアントでソケットとバイナリモードを使用しています。テキストを含むファイルは完全に送信されますが、問題はバイナリファイル(画像など)です。ソケットはすべてのバイナリデータを送信しません

ここに私のコードの一部です:

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); 
} 
URLをせずに働いていた場合は、この画面上で見ることができたとして、私のFTPクライアントは、(私は比較することがメモ帳でファイルを開く)内部の違いが不完全なファイルを取得している

サインインが必要な:また、ファイルサイズの違いがある

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

- 元のファイルは7KB程度で、送られたコピーは少ない約1KBです。私はずいぶん違ったFTPクライアントを使いましたが、同じ問題があります。

答えて

5

あなたの送信通話では、テキストデータでは正常に動作するが、バイナリデータでは動作しないstrlenを使用しています。ファイルから読み込むときには、readのような呼び出しを使用する必要があります。これは、実際に読み取ったバイト数を通知するので、send呼び出しでその多くのバイトを送信できます。

+0

明確にするには:本質的に、fgetsとstrlenを使用する際の問題は、バイナリファイル内のすべてのnullバイトが失われていることです。ヌルバイトが文字列を終了するためです。一般的にnullバイトを含まないため、テキストファイルは正常に動作します。 – PleaseStand

+0

みんなありがとう。私はちょうどあなたのヒントのおかげでこの問題を解決しました。 – Bury

関連する問題