1
3
显然,您希望限制客户端的下载速度,并且您还希望客户端做出响应 立即 连接正在关闭。 好吧,这不可能。。。没有任何妥协。
问题是
只有
以下是一些想法:
不幸的是,这两种方法在客户端都是低效的(更多的系统调用),但是如果您想让应用程序快速检测连接关闭,就必须付出这样的代价。 你在评论中说: 我不这么认为。通常,客户端协议栈会在通知应用程序代码它正在读取的连接已经关闭之前,传递从网络接收到的任何未完成的数据。 |
2
2
您的速率限制实际上并不像您想象的那样工作,因为数据实际上不是按字节发送的,而是以数据包的形式发送的。这些数据包是缓冲的,而您观察到的(下载在没有连接的情况下继续)只是您的流读取缓冲区。一旦到达缓冲区的末尾,它将等待5秒,然后抛出超时(因为这是您配置的)。 您将速率设置为8kb/s,并且正常的数据包大小通常在1kb左右,可以达到64kb,因此您仍在读取同一数据包的时间为8秒。此外,可能已经发送并缓冲了多个数据包。还有一个接收缓冲区, this buffer can be as small as 8 - 32 kB up to several MB . 所以实际上你只是在从缓冲区读取。 [编辑] . 平均而言,费率将限制在您指定的范围内。服务器将发送一组数据,然后等待客户机清空其缓冲区以接收更多数据。 |