通过套接字中断下载(recv)文件

时间:2016-07-20 06:51:43

标签: c sockets tcp

在我正在处理的应用程序中,如果我发现它不是我正在寻找的,我需要停止下载一些文件。在我开始接收文件之前,协议没有提供任何知道它的方法(比如标题等)。

作为一个例子,在某些情况下,我可能正在寻找一个大小为X字节的文件,但是在我下载了X字节并且我不断获得更多字节之后,这不是我正在寻找的文件,因为它size大于X.在这种情况下,我想停止下载以释放网络带宽资源。该协议没有提供任何方式来通知服务器。

我在某处读到close(fd)shutdown(fd, SHUT_RD)实际上不会停止下载,因为服务器将继续send()该文件,这将继续消耗网络带宽。我也不确定我是否只是停止调用recv()并且数据包仍然到达,它们是否会填充缓冲区然后开始被丢弃?如果重要,所使用的协议基于TCP(但我想要一些也可以用于基于UDP协议的解决方案)。

在我搜索程序化带宽控制(recv(),令牌桶...)作为替代解决方案后,停止对sleep()的调用将解决它变得更加令人怀疑(将下载速度降低到约在我意识到它不是我正在寻找的文件之后为零。如果服务器仍然是recv(),我如何通过减少send()呼叫来控制网络带宽使用?我没有抓住它。

主要想法是完全停止下载。

你会建议什么?

1 个答案:

答案 0 :(得分:1)

  

我读到close(fd)shutdown(fd, SHUT_RD)实际上不会停止下载的地方,因为服务器将继续send()文件,这将继续消耗网络带宽。

如果shutdown(fd, SHUT_RD)您自己的recv()将取消阻止,返回码为零,这将导致代码关闭套接字,如果有更多数据出现,将导致localhost发出RST来自对等方,这将导致发送方的ECONNRESET(经过几次send()次呼叫后,不一定立即)。

你在哪里读到这个废话?

  

我更加怀疑是否停止呼叫recv()会解决它

它不会解决它,但由于TCP流控制,它最终会阻止发送方发送。这不是解决这个问题的方法。