2

これは宿題であり、私は AC プログラマーではありません。私はこれに何日も取り組んできましたが、立ち往生しています。beej ガイドを最初から最後まで読み、Google で 1 週間検索しました。助けを求める時が来ました。期待どおりにメッセージを送受信するクライアント/サーバー TCP ソケット アプリケーションがあり、単純なファイルのアップロード/ダウンロード機能を実装する必要があります。

以下のコードはほとんど機能しますが、コピーされたファイルの先頭に 4 バイトが追加され、2 つの印刷不可能な文字とそれに続く \00\00 が追加され、クライアントが応答しなくなります。

クライアントは、select コマンドを使用して非ブロッキング ソケットによって接続されます。

改善の余地がたくさんあることは承知していますが、誰かが私が始めるのを手伝ってくれますか?

// サーバー

void put (int sockfd, char *localfile) {

    // Get file Size
    FILE *file;
    int size;

    file = fopen(localfile, "rb");
    fseek(file, 0, SEEK_END);
    size = ftell(file);
    fseek(file, 0, SEEK_SET);

    //Send file Size
    write(sockfd, &size, sizeof(int));

    //Send file as Byte Array
    char send_buffer[size];

    memset(send_buffer, 0, sizeof(send_buffer));
    //while(!feof(file)) {
    //    fread(send_buffer, 1, sizeof(send_buffer), file);
    //    write(sockfd, send_buffer, sizeof(send_buffer));
    //    memset(send_buffer, 0, sizeof(send_buffer));
    //}

    int sent;

    while((sent = fread(send_buffer, sizeof(char), sizeof(send_buffer), file)) > 0)
    {
        if(send(sockfd, send_buffer, sent, 0) < 0)
        {
            fprintf(stderr, "[Server] ERROR: Failed to send file %s. (errno = %d)\n", localfile, errno);
            break;
        }
        memset(send_buffer, 0, sizeof(send_buffer));
    }
    fclose(file);
}

//クライアント

void get(int sockfd, char *remotefile) {

    FILE *file;
    int size;

    //Read file Size
    read(sockfd, &size, sizeof(int));

    //Read file Byte Array
    char p_array[size];
    memset(&p_array, 0, sizeof(p_array));

    read(sockfd, p_array, size);

    //Convert it Back into file
    file = fopen(remotefile, "wb");
    fwrite(p_array, 1, sizeof(p_array), file);
    fclose(file);
}
4

1 に答える 1

3

ソケットの読み取り時に読み取りカウントを無視し、読み取りごとにバッファーがいっぱいになると想定するという通常のエラーを起こしています。あなたはそれを仮定することはできません。

あなたの送信ループはその間違いをしません。というわけで、それを手本に、read()代わりに使うように受信用に作り直しfread()ます。別の目的で接続を開いたままにしておく予定がない限り、ファイルのサイズのバッファを割り当てる必要がないため、ファイルのサイズより先にファイルサイズを送信する必要がないことがわかります。

memset()また、電話の理由もありません。

于 2013-03-29T02:54:14.923 に答える