【发布时间】:2010-10-15 15:29:06
【问题描述】:
我试图通过 C 中的套接字接收一些文件。但服务器向我发送了一个 1000000 字节文件的 64 字节数据包,我在目标文件上获得了大约 999902 字节。
while ((n = read(sd, buffer_in, BUFSIZE ))) // BUFSIZE = 64
{
if(n<0)
{
printf("Fail.\n");
fclose(archivo);
return -1;
}
if(fwrite(buffer_in, n, 1, f) !=1 )
{
printf("fwrite error.\n");
fclose(archivo);
return -1;
}
bytes+=n;
}
printf("We received %d bytes", bytes);
当通过本地 TCP/IP 套接字使用时,它可以工作,但不能用于慢速连接。我通过调试看到我得到了很多 64 字节的块,并且在 EOF 附近有一个 30 字节的块。我知道您可以在 read() 上获得更少的字节,因为当任何数据(> 1 字节)可用时调用返回。但是这个条件不应该被while抓住吗?当 n == 0 时应返回,即不再有数据 (EOF)。
感谢您的帮助。
(编辑)
发送代码如下:
while (n=read(file_fd, buffer, BUFSIZE))
{
write (sdaccept, buffer, n)
}
我知道 read() 和 write() 都可能返回 N
(编辑二)
用 10673 字节的 C 源测试,接收到 10575 没有损坏,除了目标文件缺少前 98 个字节!!!
【问题讨论】:
-
大约 999902?或者确切地说?
-
我发现这段代码没有明显的缺陷 - 请也显示发送代码。
-
特别奇怪,因为64正好分成1000000
-
添加了发送代码... Pax:是的,999902 正好来自一个 1 百万字节的文件。
-
你应该测试
while ((n = read(...)) > 0)。目前,即使出现错误,您仍在继续 (n == -1).
标签: c sockets file-transfer