免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2901 | 回复: 3
打印 上一主题 下一主题

[C++] 如何在服务器中实现download 限速 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-30 20:54 |只看该作者 |倒序浏览
环境 linux ,epoll
目前实现了一个简单的proxy, 实现原来  bind 一个端口, 然后client 连接 获取一个fd, 服务器主动连接一个远处的服务器。

这样就有2个fd,  类似一个pipe.  假设 fd 1 是连接 客户端的 fd 2 是连接 服务器的, 那么当fd1 有数据可读的时候,就把数据 读出来写入fd2, 如果fd2 有数据可读就写入fd1
这样 一个proxy 就完成了。 现在有个问题 想实现 限速。

使用epoll. ET 模式,目前想这样实现, 每个连客户端的fd 的数据结构 带一个时间戳, 带一个记录已读数据的数值。

struct {
   int    fd;
   time  last_read_time;
   int    last_second_readdatalength;
};

每次epoll 返回 fd 1 可读,那么就比较 时间错,如果时间戳不一样 就说明时间变化了,首先把 记录里已读数据的数值 清空,然后读取 最多 100k( 这就是我要的限速结果)
然后全写入fd2. 可读数据多余100k, 那么就放弃读, 那么epoll 以后也不会返回了。 没过1秒,就需要遍历一次 所有的fd, 每个fd 都尝试去读一下 防止阻塞住。

这个想法可行吗?

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
2 [报告]
发表于 2014-06-30 23:40 |只看该作者
代理的话,数据大部分时候是双向的

也就是说client的请求和server的反馈可能同时进行,你这样用单方向的通道实现可能会有问题

限速不知道用程序怎么实现,但用现成的有

1)iptables应该可以限制具体IP的流量和连接数

2)以及TC(Traffic Control)

论坛徽章:
0
3 [报告]
发表于 2014-06-30 23:55 |只看该作者
就是需要实现一个 nginx 的流控机制。 关键是高效!

论坛徽章:
0
4 [报告]
发表于 2014-07-02 22:22 |只看该作者
搞定!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP