0

我有一个问题,我希望是一个错误,因为我对 linux C 有点陌生。

我有一个服务器,它将文件发送到客户端。该代码在有线连接上运行良好,每次成功率 100%。但是,当我尝试在 -65dB(强)的 3G USB 连接上运行相同的代码时,客户端通常只会收到文件的前 1 或 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 回答