在我正在处理的应用程序中,如果我发现它不是我正在寻找的,我需要停止下载一些文件。在我开始接收文件之前,协议没有提供任何知道它的方法(比如标题等)。
作为一个例子,在某些情况下,我可能正在寻找一个大小为X字节的文件,但是在我下载了X字节并且我不断获得更多字节之后,这不是我正在寻找的文件,因为它size大于X.在这种情况下,我想停止下载以释放网络带宽资源。该协议没有提供任何方式来通知服务器。
我在某处读到close(fd)
或shutdown(fd, SHUT_RD)
实际上不会停止下载,因为服务器将继续send()
该文件,这将继续消耗网络带宽。我也不确定我是否只是停止调用recv()
并且数据包仍然到达,它们是否会填充缓冲区然后开始被丢弃?如果重要,所使用的协议基于TCP(但我想要一些也可以用于基于UDP协议的解决方案)。
在我搜索程序化带宽控制(recv()
,令牌桶...)作为替代解决方案后,停止对sleep()
的调用将解决它变得更加令人怀疑(将下载速度降低到约在我意识到它不是我正在寻找的文件之后为零。如果服务器仍然是recv()
,我如何通过减少send()
呼叫来控制网络带宽使用?我没有抓住它。
主要想法是完全停止下载。
你会建议什么?
答案 0 :(得分:1)
我读到
close(fd)
或shutdown(fd, SHUT_RD
)实际上不会停止下载的地方,因为服务器将继续send()
文件,这将继续消耗网络带宽。
如果shutdown(fd, SHUT_RD)
您自己的recv()
将取消阻止,返回码为零,这将导致代码关闭套接字,如果有更多数据出现,将导致localhost发出RST来自对等方,这将导致发送方的ECONNRESET(经过几次send()
次呼叫后,不一定立即)。
你在哪里读到这个废话?
我更加怀疑是否停止呼叫
recv()
会解决它
它不会解决它,但由于TCP流控制,它最终会阻止发送方发送。这不是解决这个问题的方法。