本帖最后由 VisualEleven 于 2011-11-23 12:35:44 编辑

解决方案 »

  1.   

    崩想了。WINDOWS 下的话就做 NDIS 驱动吧。
      

  2.   

    NDIS层做驱动是啥都能搞 ,但这层的开发能熟练winpcap的人也不多吧。说到bt,迅雷都有对下载的限速,这类文件传输都是采用p2p协议,当然像迅雷这样成熟的公司,p2p协议一定丰富了许多自己的算法。要实现这个功能方式有许多,如果不做限制,如果你带宽良好,传输速率就是服务器数据的比特率。实现可以有两种思路,一:告诉服务器降低比特率,二:客户端接收效率降低。以前自己这样做过,但是是个人写着玩的,不是商业级的开发。
      

  3.   


    第一种思路正是我在考虑的,因为服务器也是自己写的,但是,有一种情况,像从FTP、Web服务器下载,这是服务器都不是自己写的,一思路就不可行。我的服务器协议通道还是很容易扩展的,准备实践一下一思路
      

  4.   


    限速.限制send recv就行了.防火墙都是这么搞的.
      

  5.   


    send和recv也是操作socket的缓冲区,如果不让recv或者定时recv的话,又回到了上面那个问题
      

  6.   

    这个…… 没看明白。你不就是想要限速吗?为什么还说“传输速度却也高不了”?
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  7.   

    下载和上传的部分代码应该是你自己写的吧?
    我也写过类似的限速下载的程序。加一个速度记录INT。
    各线程下载时累加INT的值,当该INT大于设定下载网速是,停止下载代码的运行。
    每秒清零一次。
      

  8.   

    上传  比如重写send 函数, 如果超出速度, 可以返回失败, 错误用缓冲满
    下载          recv    用sleep也是很正常的
      

  9.   

    应用层加throttle ,异步读取拆分成小的原子块,排队读写网络,大概就是这样,底层方式有点...
      

  10.   

    让他 的send,recv,sendto,recvto,wsa系统函数延时就可以了,目前我就这样做的
    自己写lsp或者winsocket hook就搞定
      

  11.   

    楼主提的好问题,理论上应该是制造一个count值,超过这个值就不读了。
    你所说的慢慢发送,除非是改写驱动,很明显p2p并非这样。
    从内核模型说起,tcp/ip协议好像对时间并没有定义,只是一方不停send,一方不停recv。发送时数据放入send buffer,然后再发送出去。如果send buffer已经满了,里边的数据没有发送出去,此时继续调用send会失败或是一直阻塞着,取决于你使用的是同步或是异步模型。recv时道理也相同,recv buffer数据满了时还没有读取就不再接收数据了。所谓的滑动窗口就是这个东西,他通常反映的是对方内核buffer的能力,当对方buffer满了时tcp窗口会通告发送方对方已经无能力接收了,省点力气吧。
    setsockopt即使把buffer设置为1,只要网速够快也一样起不到限速的作用。此外,还会因为频繁调用send,recv导致cpu消耗过高,反倒不是一个好选择。最好方案是超过count值就不再发送或接受,此时recv或send方的buffer会迅速被数据充满,从而不再发送数据了,带宽被节约出来给其他程序了。
      

  12.   

    需要那么复杂吗?应用层就可以实现的事。迅雷的限制其实也不准的。比如限制200k,实际速度也有很大的波动。上传限速很简单,当前1000ms内发送字节快接近上限的话,剩下的时间就不发送数据了。http下载的话,降低request的间隔时间,或减少线程,每秒收到的数据就变少了。p2p的话,需要服务器参与。让服务器根据你的速度需求维护数据转发