我试图通过 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 < BUFSIZE,但是这个循环不应该相应地解决吗?我将 n 相加并返回 1000000,即确切的大小。
(编辑二)
用 10673 字节的 C 源测试,接收 10575 没有损坏,除了目标文件缺少前 98 个字节!!!