模拟Windows中TCP套接字的慢速

时间:2013-11-14 14:41:02

标签: windows sockets tcp bandwidth-throttling

我正在构建一个使用TCP套接字进行通信的应用程序。我想测试它在慢速条件下的表现。

网站上有类似的问题,但据我了解,它们处理的是HTTP流量,或者是关于Linux的。我的流量不是HTTP,只是普通的TCP套接字,操作系统是Windows。

我尝试使用fiddler的Modem Speed设置,但它不起作用,它似乎只适用于HTTP连接。

3 个答案:

答案 0 :(得分:2)

虽然您可能想要投入大量的单元测试,但您可以使用VMWare Workstation模拟各种网络条件:

Network Settings Screen

您必须安装虚拟机进行测试,设置桥接网络(用于访问真实网络的虚拟机)并将代码上传到虚拟机。

之后,您可以开始更改设置并查看应用程序的执行情况。

NetLimiter也可以使用,但它的选项较少(在您的情况下,packet loss测试非常有趣,并且在netlimiter中不可用)。

答案 1 :(得分:1)

我认为你在这里采取了错误的做法。

通过精心设计的单元测试,您可以实现所需的一切。可以在受控条件下在单元测试环境中模拟慢速网络链接导致的所有事情。

你的代码必须处理的事情来处理“慢”链接只是你应该处理的事情,包括:

  • 正确处理碎片消息。所有网络读取代码都需要正确地假设每次读取将在1个字节和读取缓冲区大小之间返回。你不应该假设你会得到完整的'消息',因为TCP对你的消息概念一无所知。
  • TCP流量控制导致同步发送失败并出现某种形式的“稍后尝试”错误,或者您的异步发送成功并可能使用不受控制的资源量(有关详细信息,请参阅here)。请注意,即使在“快速”链接上发生这种情况,如果发送速度超过接收方消耗速度,也会发生这种情况。
  • 超时 - 再次,这不仅限于“慢”链接。您的所有超时处理代码都应该是健壮的并经过测试。您可能希望确保任何读取超时都基于任何读取完成,而不是在x时间内读取完整的消息。您可能会以较慢的速度获取数据,但在获取数据时,链接仍然存在。
  • 连接失败 - 再次不是特定于“慢”链接的东西。您需要知道如何处理任何时候重置的连接。

总之,通过在模拟的慢速网络上运行客户端和服务器无法实现的任何功能都无法通过一组体面的单元测试来实现,并且您希望在此类链接上测试的所有内容都可能会影响您的任何任何链接速度的连接。

答案 2 :(得分:1)

有一个出色的Windows实用程序,可以进行调节和更多操作:

https://jagt.github.io/clumsy/