0

私はLinux Cに少し慣れていないので、間違いだと思っている問題があります.

クライアントにファイルを送信するサーバーがあります。コードは有線接続で完全に正常に動作し、毎回 100% の成功率です。ただし、同じコードを 3G USB 接続で -65dB (強) で実行しようとすると、クライアントは通常、ファイルの最初の 1000 バイトまたは 2000 バイトしか受信しません。(構文エラーでスペースが適切に配置されないことを許してください)

        // CLIENT CODE

        char* fs_name = "/target/to/send";
        char sdbuf[LENGTH]; // Send buffer, LENGTH == 512
        printf("Sending %s to the Client... \n", fs_name);
        FILE *fs = fopen(fs_name, "r");
        if(fs == NULL)
        {
            fprintf(stderr, "ERROR: File %s not found on server. (errno = %d)\n", fs_name, errno);
            exit(1);
        }

        bzero(sdbuf, LENGTH); 
        int fs_block_sz; 
        while((fs_block_sz = fread(sdbuf, sizeof(char), LENGTH, fs))>0)
        {
            if(send(client, sdbuf, fs_block_sz, 0) < 0)
            {
                fprintf(stderr, "ERROR: Failed to send file %s. (errno = %d)\n", fs_name, errno);
                exit(1);
            }
            bzero(sdbuf, LENGTH);
        }
        printf("File send Success\n");



            // SERVER CODE

        char* fr_name = "/home/file/to/save";

        FILE *fr = fopen(fr_name, "a");

        if(fr == NULL)

            printf("File %s Cannot be opened.\n", fr_name);

        else
        {
                // zero out bytes
            bzero(revbuf, LENGTH); 

            int fr_block_sz = 0;

            while((fr_block_sz = recv(sd, revbuf, LENGTH, 0)) > 0)  //LENGTH == 512
            {
            int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);

                if(write_sz < fr_block_sz)
            {
                    error("File write failed.\n");
                }
            bzero(revbuf, LENGTH);
            if (fr_block_sz == 0 || fr_block_sz != 512) 
            {
            break;
            }
        }

                // error checking
        if(fr_block_sz < 0)
                {
        if (errno == EAGAIN)
        {
            printf("recv() timed out.\n");
        }
        else
        {
            fprintf(stderr, "recv() failed due to errno = %d\n", errno);
        }


            fclose(fr);

誰かが私が間違っていることに光を当てることができれば、私は最も感謝しています. 読んでくれてありがとう。

編集: サーバーは Ubuntu 10.04 で、クライアントは Arch Linux ARM で、送信されるファイルのタイプは ARM バイナリです。

4

1 に答える 1

0

あなたの主な問題は、サーバーとラベル付けされたコードにあると思いますが、実際にはクライアントのようです。recvがそれぞれ 512 バイトすべてを取得すると仮定しますrecvが、それは正しくありません。短い読み取りを取得できます。正確に LENGTH (つまり 512) を読み取っていない場合は、少し下で読み取りループから抜け出します。これは、数千バイト後に pgm が終了する理由を説明しています。

    while ((fr_block_sz = recv(sd, revbuf, LENGTH, 0)) > 0)  //LENGTH == 512
    {
        int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);

        if (write_sz < fr_block_sz)
        {
            error("File write failed.\n");
        }

        bzero(revbuf, LENGTH);

        if (fr_block_sz == 0 || fr_block_sz != 512)
        {
            break;
        }

    }

あなたはこのようなものがもっと欲しい:

    while ((fr_block_sz = recv(sd, revbuf, LENGTH, 0)) > 0)  //LENGTH == 512
    {
        if (fr_block_sz < 0)
            if (errno == EAGAIN)
               continue;
            else
               error;

        if (fr_block_sz == 0)
            break; //done

        int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);

        if (write_sz < fr_block_sz)
        {
            error("File write failed.\n");
        }

        bzero(revbuf, LENGTH);
    }
于 2013-07-06T00:36:28.000 に答える