- 论坛徽章:
- 0
|
环境 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 都尝试去读一下 防止阻塞住。
这个想法可行吗? |
|