0

だから私は簡単なファイル転送方法を作成しようとしています。小さなファイル(数バイト)では完全に機能します。しかし、2 kBのサイズのファイルを転送したい場合は、ファイル内の文字ではなく、Unicode文字を返します。

サーバ:


void DownloadFile(SOCKET Socket){
    if(Socket == NULL){
        return;
    }
    while(1){
        char filename[1024];
        recv(Socket, filename, sizeof(filename), 0);
        if(filename[0] == '.'){
            break;
        }
        FILE* fp = fopen(filename, "r");
        fseek(fp, 0, SEEK_END);
        long FileSize = ftell(fp);
        char GotFileSize[1024];
        _itoa_s(FileSize, GotFileSize, 10);
        send(Socket, GotFileSize, 1024, 0);
        rewind(fp);


        long SizeCheck = 0;
        char* mfcc;

        if(FileSize > 1499){
            mfcc = (char*)malloc(1500);
            while(1){
                if(SizeCheck >= FileSize){
                    fclose(fp);
                    Sleep(500);
                    free(mfcc);
                    break;
                }
                fread_s(mfcc, 1499, sizeof(char), 1499, fp);
                send(Socket, mfcc, FileSize, 0);
                SizeCheck += strlen(mfcc);
            }
        }
        else{
            mfcc = (char*)malloc(FileSize + 1);
            fread_s(mfcc, FileSize, sizeof(char), FileSize, fp);
            send(Socket, mfcc, FileSize, 0);
            fclose(fp);
            Sleep(500);
            free(mfcc);
        }
    }
    return;
}

クライアント:


void DownloadFile(SOCKET Socket){
    if(Socket == NULL){
        return;
    }
    while(1){
        printf("Input local filename: ");
        char localfile[1024];
        gets_s(localfile, 1024);
        if(localfile[0] == '.'){
            send(mySocket, localfile, sizeof(localfile), 0);
            break;
        }
        printf("Input remote filename: ");
        char filename[1024];
        gets_s(filename, 1024);
        if(filename[0] == '.'){
            send(mySocket, filename, sizeof(filename), 0);
            break;
        }
        send(mySocket, filename, sizeof(filename), 0);
        char GotFileSize[1024];
        recv(mySocket, GotFileSize, 1024, 0);
        long FileSize = atoi(GotFileSize);
        long SizeCheck = 0;
        FILE *fp = fopen(localfile, "w");
        char* mfcc;
        if(FileSize > 1499){
            mfcc = (char*)malloc(1500);
            while(1){
                if(SizeCheck >= FileSize){
                    fclose(fp);
                    Sleep(500);
                    free(mfcc);
                    break;
                }
                recv(mySocket, mfcc, 1499, 0);
                fprintf(fp, "%s", mfcc);
                SizeCheck += strlen(mfcc);
            }
        }
        else{
            mfcc = (char*)malloc(FileSize + 1);
            recv(mySocket, mfcc, FileSize, 0);
            fprintf(fp, "%s", mfcc);
            fclose(fp);
            Sleep(500);
            free(mfcc);
        }
    }
}

ここで、このファイルを転送すると、次のようになります。


Testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest

転送されたファイルには次のものが含まれています。


Testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
𭺫«««««««îþîþtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesº««««««««îþîþttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
ð­º
𭺫«««««««îþîþ
4

2 に答える 2

3

なぜこれ:

            fread_s(mfcc, 1499, sizeof(char), 1499, fp);
            send(Socket, mfcc, FileSize, 0);

FileSizeバイトを送信していますが、どれだけ読んだかさえわかりません。読み取りの戻り値を確認してください。ファイルに0バイトが含まれているかどうかわからないため、strlen()を使用しないでください。

于 2010-08-10T13:34:36.327 に答える
0

修正しました。改行のサイズは2バイトですが、私のプログラムでは1つしか数えていません。FilesizeとSizecheckの違いは実際にはファイルの行数であるため、これを理解しました。

新しいループ:

char* mfcc;
mfcc = (char*)malloc(FileSize + 1);
while(SizeCheck {issmallerthan} FileSize){
    int Received = recv(mySocket, mfcc, FileSize, 0);
    int Written = fwrite(mfcc, sizeof(char), Received, fp);
    SizeCheck += Written;
    for(int i = 0; i {issmallerthan} Written; i++){
        if(mfcc[i] == '\n'){
            SizeCheck += 1;
        }
    }
}
fclose(fp);
free(mfcc);

送信側はこんな感じです。

すべての助けをありがとう。:3

名探偵コナン :D

于 2010-08-31T18:47:23.337 に答える