C套接字接收文件

时间:2014-05-10 21:22:13

标签: c file sockets ftp transfer

我正在开发非常简单的ftp客户端。我创建了一个数据连接套接字,但我无法成功传输文件:

FILE *f = fopen("got.png", "w");
int total = 0;
while (1){      
    memset(temp, 0, BUFFSIZE);
    int got = recv(data, temp, sizeof(temp), 0);

    fwrite(temp, 1, BUFFSIZE, f);
    total += got;

    if (total == 1568){
    break;
    }
}
fclose(f);

BUFFSIZE = 1568

我知道我的文件大小是1568字节,所以我尝试下载它只是为了测试。当我尝试下载.xml或.html文件时,一切都是文件,但当我尝试下载png或avi文件时没有任何好处。简单的原始文件大小是1568但got.png文件大小是1573.我无法弄清楚可能导致这种情况的原因。

编辑:

我修改了我的代码,现在它看起来像(它可以接受任何文件大小):

FILE *f = fopen("got.png", "w");
    while (1){
        char* temp = (char*)malloc(BUFFSIZE);
        int got = recv(data, temp, BUFFSIZE, 0);

        fwrite(temp, 1, got, f);

        if (got == 0){
            break;
        }
    }
    fclose(f);

仍然收到的文件太长了2个字节。

2 个答案:

答案 0 :(得分:0)

即使您只收到部分缓冲区,也总是在写一个完整的缓冲区。所有TCP问题中约有50%是同样的问题。

没有必要使用memset。我希望temp是一个数组,以便sizeof(temp)不会计算到本机指针大小。在那里更好地使用BUFFSIZE


看到你的编辑,在修复第一个问题之后还有另一个问题:以二进制模式打开文件。

答案 1 :(得分:0)

您正在以文本模式打开文件,因此在写入文件时,裸CR / LF字符将转换为CRLF对。您需要以二进制模式打开文件:

FILE *f = fopen("got.png", "wb");
相关问题