我正在尝试通过C语言的套接字接收一些文件。但是服务器会以64字节的数据包发送1000000字节的文件,例如,而我在目标文件中只能获得大约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字节之外!!!
while ((n = read(...)) > 0)
。目前即使出现错误 (n == -1
),你仍在继续执行。 - user207421