我从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
这里有什么问题?
答案 0 :(得分:4)
您忽略nBytes
的{{1}}返回值,而是始终将read()
个字节写入输出。这是错误的,对于部分读取(sizeof buf
小于nBytes
),您将垃圾注入写入的流中。
写作当然也应该使用sizeof buf
。
另外:写入可能会失败,并写入 less 而不是您请求的,所以您需要循环它,直到您知道所有字节都已写入,或者您从中获得错误。
答案 1 :(得分:2)
您似乎没有将您的FTP服务器置于二进制模式,而是在ascii中进行传输。这将用\ r \ n序列替换每个\ n。
此外,展开的回复也是正确的。