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

C 为什么写入(接收)的字节数不正确?,c,file,ftp-client,vxworks,C,File,Ftp Client,Vxworks,我从ftp套接字连接接收数据。连接似乎没有问题,但由于某些原因,我没有得到写入目标文件的正确字节数。 我的源文件大小为18735004字节,我的算法将19713024字节写入该文件。现在可以这样了吗? 我的守则如下: if (ftpXfer ("3.94.213.53", "**", "******", NULL, "RETR %s", "/home/ge", "ngfm.bin", &ctrlSock, &dataSock)

我从ftp套接字连接接收数据。连接似乎没有问题,但由于某些原因,我没有得到写入目标文件的正确字节数。 我的源文件大小为
18735004字节
,我的算法将
19713024字节
写入该文件。现在可以这样了吗? 我的守则如下:

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

这里怎么了?

您忽略了
read()
中的
nBytes
返回值,而总是将
sizeof buf
字节写入输出。这是错误的,对于部分读取(其中
nBytes
小于
sizeof buf
),您将垃圾注入到写入流中

写入当然也应该使用
nBytes


另外:写入可能会失败,并且写入的内容会少于您请求的内容,因此您需要循环写入,直到您知道所有字节都已写入,或者从中得到错误。

您忽略了
nBytes
read()
返回的值,而总是将
sizeof buf
字节写入输出。这是错误的,对于部分读取(其中
nBytes
小于
sizeof buf
),您将垃圾注入到写入流中

写入当然也应该使用
nBytes


另外:写入可能会失败,并且写入的内容会少于您请求的内容,因此您需要循环写入,直到您知道所有字节都已写入,或者从中得到错误。

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


此外,unwind的回复也是正确的。

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


另外,unwind的回复也是正确的。

在我的代码中看不到这一点,但ftpXfer()已经设置了二进制模式。我可以在Wireshark中看到
请求:键入I 50007 50007
,但无论如何我都会支持你的回复!我经常被问到类似的问题,在大多数情况下,问题是ascii传输。因此,当我没有看到您使用二进制时,我甚至没有查看代码的其余部分:-/无论如何,谢谢您的升级投票。您在我的代码中看不到这一点,但ftpXfer()已经设置了二进制模式。我可以在Wireshark中看到
请求:键入I 50007 50007
,但无论如何我都会支持你的回复!我经常被问到类似的问题,在大多数情况下,问题是ascii传输。因此,当我没有看到您使用二进制代码时,我甚至没有看代码的其余部分:-/无论如何,谢谢您的支持。是的,这很有意义!谢谢你打开我的眼睛@cerr I/O是。。。也许这本身并不难,但充满了细节,它可能会失败。好吧,我修复了它,编译,上传了新的图像,运行了两个测试,都成功了——因此我认为它现在已经修复了!谢谢是的,这很有道理!谢谢你打开我的眼睛@cerr I/O是。。。也许这本身并不难,但充满了细节,它可能会失败。好吧,我修复了它,编译,上传了新的图像,运行了两个测试,都成功了——因此我认为它现在已经修复了!谢谢