我如何减慢Windows上的TCP连接?

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

在读写线程之间创建一个固定长度的队列 。 队列满时阻塞入队队列,空队列时入队队列。 经常信号量或互斥/条件变量应该工作。 玩队列大小,所以慢线程总是很忙。

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

你不能在10mbps的链接上放10M以上的速度,所以写在较慢链接上的线程应该在你写的时候开始阻塞。 所以只要你的线程使用与写入缓冲区相同的大小读取缓冲区,线程应该只消耗尽可能快的数据,因为它可以从10mbps的管道中退出。 为了让远程发送者不会超过10mbps进入100mbps管道,任何流量控制都将由TCP协议自动处理。

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

停止读取数据,当你不能写它。

从100Mb / s链路进入你的程序有一个字节队列,并有一个队列从你的程序到10Mb / s链路。 当传出队列已满时,停止从传入队列读取数据,并在100Mb / s链路上关闭客户端的TCP。

您可以在阅读器和书写器之间使用内部队列来实现这一点。

已经阐述了许多复杂而正确的解决方案。 但是,要真正解决问题的关键 – 为什么你有两个线程? 如果你做了socket-100的读取,socket-10写入一个线程,它自然会阻塞写入,你不必设计任何复杂的东西。

如果你正在做一个非阻塞的select()风格的事件循环:如果你的外出数据队列小于一些硬编码的最大尺寸,只调用FD_SET(readSocket,&readSet)。

这样,当传出套接字落后时,代理将停止从更快的客户端读取数据,直到它恢复为止。 TCP协议将负责其余部分(特别是,它会告诉你的客户端放慢速度一段时间)