如何减慢Windows上的TCP连接速度?

时间:2010-02-23 02:49:09

标签: c++ windows proxy tcp

我正在开发一个Windows代理程序,其中两个通过不同适配器连接的TCP套接字由我的程序桥接。也就是说,我的程序从一个套接字读取并写入另一个套接字,反之亦然。每个套接字都由自己的线程处理。当一个套接字读取数据时,它会排队等待另一个套接字写入。我遇到的问题是当一个链接以100Mb运行而另一个链接以10Mb运行时。我从100Mb链接读取数据的速度比我写入10Mb链接的速度快。如何“减速”更快的连接,使其基本上以较慢的链接速度运行?将较快的链接更改为较慢的速度不是一种选择。 --Thanks

5 个答案:

答案 0 :(得分:8)

在读写线程之间创建固定长度队列。当队列已满时阻塞队列,当队列为空时阻塞队列。常规信号量或互斥/条件变量应该有效。使用队列大小播放,以便较慢的线程始终处于忙碌状态。

答案 1 :(得分:6)

如果这是一个问题,那么你的程序写错了。

你不能在10mbps的链接上放置超过10mbps,所以写在较慢链接上的线程应该在你写的时候开始阻塞。因此,只要您的线程使用与写入缓冲区相同大小的读取缓冲区,线程就应该尽可能快地使用数据,因为它可以将数据丢回到10mbps管道中。任何流量控制都需要保持远程发送器不超过10mbps到100mbps管道中,TCP协议将自动处理。

所以只要你的读写缓冲区在该线程(或任何线程)中的大小相同,它就不应该是一个问题。

答案 2 :(得分:4)

当您无法写入数据时,请停止阅读数据。

从100Mb / s链接进入程序的字节队列,以及从程序到10Mb / s链接的队列。当传出队列已满时,停止从传入队列和TCP中读取,并在100Mb / s链路上重新启动客户端。

您可以使用阅读器和编写器之间的内部队列来干净地实现此目的。

答案 3 :(得分:3)

阐述了许多复杂而正确的解决方案。但实际上,要解决问题的关键 - 为什么你有两个线程?如果你在一个线程中执行socket-100读取,socket-10写入,它自然会阻止写入,你不必设计任何复杂的东西。

答案 4 :(得分:0)

如果您正在进行非阻塞,请选择() - 样式事件循环:如果您的传出数据队列小于某个硬编码的最大大小,则只调用FD_SET(readSocket和& readSet)。

这样,当传出套接字落后时,您的代理将停止从更快的客户端读取数据,直到它重新启动。 TCP协议将负责其余的工作(特别是,它将告诉您更快的客户端减速一段时间)