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クライアントを使いましたが、同じ問題があります。
明確にするには:本質的に、fgetsとstrlenを使用する際の問題は、バイナリファイル内のすべてのnullバイトが失われていることです。ヌルバイトが文字列を終了するためです。一般的にnullバイトを含まないため、テキストファイルは正常に動作します。 – PleaseStand
みんなありがとう。私はちょうどあなたのヒントのおかげでこの問題を解決しました。 – Bury