基本解决方案是通过某种方式为连接添加带宽限制。
对我来说理想的解决方案应该具备以下特点:
- 支持高级网络属性(延迟、丢包) - 开源 - 具有与标准套接字类似的 API(或者封装在它们周围) - 在 Windows 和 Linux 上都能工作 - 支持 IPv4 和 IPv6
我看到了一些在系统级别上工作的选项,甚至可以作为代理(Dummynet、WANem、neten 等),但这对我来说行不通,因为我想手动模拟每个套接字(例如,用调制解调器仿真打开一个套接字,用 3G 仿真打开另一个套接字。基本上我想知道这些工具是如何实现的。
编辑:我需要将此功能嵌入到自己的产品中,因此使用额外的盒子或需要手动配置的第三方工具是不可接受的。我想编写代码,做和这些工具一样的事情,我的问题是如何做到这一点。
结语:回想起来,我的问题有点误导人。显然,没有直接在套接字上实现我想要的功能的方法。有两个选择:
通过在发送和接收操作之前添加延迟,可以获得非常粗略的网络仿真(固定延迟用于延迟,延迟发送,以便不要发送超过每秒 X 个字节,用于带宽)。
将网络仿真逻辑作为代理添加(基于 @m0she 和其他人的答案)。可以通过代理发送请求,或使用代理拦截请求,然后添加所需的模拟。但是,与其编写自己的代理实现,使用一个现成的解决方案更为明智 - 从我所见到的情况来看,Dummynet 可能是最佳选择(这就是 webpagetest.org 所使用的内容)。其他选项可以在下面的答案中找到,我还会添加 DonsProxy。
这是更好的方法,因此我接受了这个答案。