递归复制功能,用于将数据从套接字复制到文件。怎么了?

时间:2017-06-25 18:56:16

标签: c sockets recursion copy

我的递归复制功能适用于文件,但不适用于socket to file。我相信这是因为文件是“缓冲”的输入/输出。套接字没有缓冲吗?那么如何使我的复印机对缓冲/非缓冲输入输出工作?

这是我的复印功能。

/* file_download() - function to download a file.
 */
size_t file_download(int sockfd, FILE *fout) {
    char data[CHUNK_SIZE];
    int bytesRead, bytesWritten;
    static size_t total_bytes = 0;

    bytesRead = read(sockfd, data, sizeof(data));
    if(bytesRead > 0)
        bytesWritten = fwrite(data, 1, bytesRead, fout); /* Fixed this line */
    if(bytesWritten == bytesRead)
        return total_bytes;
    else
        total_bytes += bytesWritten;
    file_download(sockfd, fout);
}

它的作用是仅在未缓冲时复制一个字节的数据。但是,它在缓冲输入/输出时复制整个事物。任何帮助解决这个问题将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:-2)

这是实际可行的代码,但是因为Antti Haapala让我知道我在fwrite上有两个参数后缀......但这是有效的。

/* file_download() - function to download a file.
 */
size_t file_download(int sockfd, FILE *fout) {
    char data[CHUNK_SIZE];
    int bytesRead, bytesWritten;
    static size_t total_bytes = 0;

    bytesRead = read(sockfd, data, sizeof(data));
    if(bytesRead > 0)
        bytesWritten = fwrite(data, 1, bytesRead, fout);
    if(bytesRead == 0)
        return total_bytes;
    else if(bytesWritten == bytesRead)
        total_bytes += bytesWritten;
    else
        return -1;
    file_download(sockfd, fout);
}