【发布时间】:2012-06-28 17:07:48
【问题描述】:
我正在寻找一种将网络仿真添加到套接字的方法。
基本的解决方案是为连接增加带宽限制。
对我来说理想的解决方案是:
- 支持高级网络属性(延迟、丢包)
- 开源
- 具有与标准套接字相似的 API(或环绕它们)
- 在 Windows 和 Linux 上工作
- 支持 IPv4 和 IPv6
我看到了一些在系统级别上工作的选项,甚至作为代理(Dummynet、WANem、neten 等),但这对我不起作用,因为我希望能够手动模拟每个套接字(例如,打开一个带有调制解调器仿真的套接字和一个带有3G仿真的套接字。基本上我想知道这些工具是如何做到的。
编辑:我需要将此功能嵌入到我自己的产品中,因此使用额外的盒子或需要手动配置的第三方工具是不可接受的。我想编写与那些工具做同样事情的代码,我的问题是如何去做。
结语:事后看来,我的问题有点误导。显然,没有办法直接在套接字上做我想做的事。有两种选择:
为发送/接收操作添加延迟(基于@PaulCoccoli 的回答):
通过在发送和接收之前添加延迟,您可以获得非常粗略的网络模拟(延迟的恒定延迟,延迟发送,每秒发送不超过 X 字节,带宽)。
保罗的回答和评论给了我很大的启发,所以我奖励了他。
将网络模拟逻辑添加为代理(基于@m0she 和其他人的回答):
要么通过代理发送请求,要么使用代理拦截请求,然后添加所需的模拟。但是,使用现成的解决方案而不是编写自己的代理实现更有意义——从我所见Dummynet 可能是最好的选择(这就是webpagetest.org 所做的)。其他选项在下面的答案中,我也会添加DonsProxy
这是更好的方法,所以我接受这个答案。
【问题讨论】:
-
这是一个 C++ 应用程序,虽然你是对的 - 套接字是 C(winsock 和 POSIX)
-
C 也没有套接字......操作系统提供的库有(带有 C 接口)。不要学究气... :)
-
@DrewHall - 这不是迂腐,这是有用的。基本上,这意味着我无法使用标准套接字库真正模拟不同的网络条件。那还有什么?
-
你想给真实的网络流量增加延迟,还是只是模拟网络流量?
-
@PaulCoccoli - 我正在生成我需要的特定流量(充当客户端,向服务器发出请求)我希望服务器“感觉”就像处理连接速度很慢的客户端跨度>
标签: c++ sockets networking network-programming emulation