为什么这不写(接收)正确的字节数?

时间:2013-12-17 17:13:10

标签: c file ftp-client vxworks

我从ftp套接字连接接收数据。连接似乎很好,但由于某种原因,我没有得到写入目标文件的正确的字节数。 我的源文件大小为18735004 Bytes,我的算法将19713024 Bytes写入文件。现在可以吗? 我的代码:

if (ftpXfer ("3.94.213.53", "**", "******", NULL,
             "RETR %s", "/home/ge", "ngfm.bin",
             &ctrlSock, &dataSock) == ERROR)
    return (ERROR);

pFile = fopen( "flash:/ngfm.bin", "wb" );
if ( pFile == NULL ) {
    printf("fopen() failed!\n");
    status = ERROR;
}

while ((nBytes = read (dataSock, buf, sizeof (buf))) > 0) {
    cnt++;
    n+=fwrite (buf , sizeof(char), sizeof(buf), pFile);
    if(cnt%100==0)
        printf(".");
}
fclose( pFile );
printf("%d Bytes written to flash:/ngfm.bin\n",n);

屏幕输出结束于:

19713024 Bytes writen to flash:/ngfm.bin

这里有什么问题?

2 个答案:

答案 0 :(得分:4)

您忽略nBytes的{​​{1}}返回值,而是始终将read()个字节写入输出。这是错误的,对于部分读取(sizeof buf小于nBytes),您将垃圾注入写入的流中。

写作当然也应该使用sizeof buf

另外:写入可能会失败,并写入 less 而不是您请求的,所以您需要循环它,直到您知道所有字节都已写入,或者您从中获得错误。

答案 1 :(得分:2)

您似乎没有将您的FTP服务器置于二进制模式,而是在ascii中进行传输。这将用\ r \ n序列替换每个\ n。

此外,展开的回复也是正确的。