TCP 编程中如何实现流量控制(100分)

  • 主题发起人 主题发起人 estorm
  • 开始时间 开始时间
E

estorm

Unregistered / Unconfirmed
GUEST, unregistred user!
我原先考虑过再 recv(或send) 之后用sleep(...) 的方法来 控制recv(或send)的速度
后来考虑了一下,用这种方法,send不会出什么,但是recv可能会有问题,因为sleep的过程中,可能会使send过来的数据因为recv端的接收的数据缓冲溢出而丢失。
所以请问那位高手知道解决的办法。比如说控制 TC P通讯中三次握手的响应时间。
 
增加自己的流量监测控制包,通过该包来实现。
不要用sleep方式来强行中断,这样的话溢出的数据就会被丢失。
client:应答式处理,没收到server的返回,不继续发送。
server:流量太大时,不发送应答信息。或者针对某一socket延迟处理信息。
 
to:armyjiang
这个方法我考虑过,但是并不通用。比如要控制http或者ftp下载流量的时候这个方法就不行了.我是想实现象FlashGet,NetAnts那样的下载速度限制
 
没人知道吗
 
哈哈,我试了一下,用sleep来实现还是可以的,看来自己想的太复杂了
不过从网络利用率上面来讲,可能用sleep的话不是很高,如果能从底层来控制就更酷了.
 
用QOS啊~~就是写起来有点烦
 
在组塞方式下很容易实现流量控制,在异步模式下比较困难, 不过也是可以的,
我最近在异步模式下实现了流量控制,效果还不错,不过实话说很麻烦,尤其
是异步模式下。我没有用sleep那样效率不高,而且影响并发的处理其他用户的请求。
 
我的观点:
网卡的发送频率是一定的,取决于时钟标准。所以限速目前只能在软件上模拟实现,说白了就是发送的字节/时间,一个平均值上的限制,0.005s发送100k,0.995s休息,就是100k/s。阻塞状态下实现就很简单(多线程编程上可以看作就只有一个线程),异步就复杂多了,不知张兄用什么方法?消息队列的重新排列,还是消息转移至单独的线程?
 
TO:张无忌
说出来大家共享一下吧
 
不知道estorm为什么要控制TCP流量?
我不控制流量异步模式用猫上传和下文件都没问题。
我写的控制流量只是为了节约带宽,提高并行连接数目而已。
 
to:张无忌
我是想局域网中减少某一个Client在访问server端程序时的带宽占用
 
控制速度一般有四种做法:
1。在交换机或者路由那控制速度。这个最有效
2。用QOS,但是这个需要路由什么的支持,但是支持率不高,所以使用不普遍。
3。控制服务器端的发送速度,目前一般都是这样实现的。
4。控制客户部分接受的速度,也就是控制recv,也能实现控制速度,楼主在帖子
里说的放慢recv速度会导致内存溢除是错误的,只要错误的编码会导致这个问题。
 
使用 Delphi 6 以上提供的 Indy 控件吧
你们说的问题,这个控件的作者全部搞定了

有 Indy Clients 和 Indy Server 分别实现客户端和服务端

Demos下 Indy 目录有相关信息
 
to:truewaylee
Indy 也是用sleep的,和我的方法一样
大家有没有更好的方法了,一起讨论呀~~~~~
 
estorm兄,打扰您一下,因为实在是很急,在我的帖子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2209357
你发表您的加密原码,能不能帮我解释一下,或者给个例子,我不知道怎么样调用加密和解密的方法,分数不是很多,实在是没有分了,还请帮忙,非常感谢
 
to 张无忌 
  你的意思是说,只要好好控制recv和send就完事了,我也是这样想的,
 
后退
顶部