- 論壇徽章:
- 0
|
環(huán)境 linux ,epoll
目前實現(xiàn)了一個簡單的proxy, 實現(xiàn)原來 bind 一個端口, 然后client 連接 獲取一個fd, 服務(wù)器主動連接一個遠處的服務(wù)器。
這樣就有2個fd, 類似一個pipe. 假設(shè) fd 1 是連接 客戶端的 fd 2 是連接 服務(wù)器的, 那么當(dāng)fd1 有數(shù)據(jù)可讀的時候,就把數(shù)據(jù) 讀出來寫入fd2, 如果fd2 有數(shù)據(jù)可讀就寫入fd1
這樣 一個proxy 就完成了。 現(xiàn)在有個問題 想實現(xiàn) 限速。
使用epoll. ET 模式,目前想這樣實現(xiàn), 每個連客戶端的fd 的數(shù)據(jù)結(jié)構(gòu) 帶一個時間戳, 帶一個記錄已讀數(shù)據(jù)的數(shù)值。
struct {
int fd;
time last_read_time;
int last_second_readdatalength;
};
每次epoll 返回 fd 1 可讀,那么就比較 時間錯,如果時間戳不一樣 就說明時間變化了,首先把 記錄里已讀數(shù)據(jù)的數(shù)值 清空,然后讀取 最多 100k( 這就是我要的限速結(jié)果)
然后全寫入fd2. 可讀數(shù)據(jù)多余100k, 那么就放棄讀, 那么epoll 以后也不會返回了。 沒過1秒,就需要遍歷一次 所有的fd, 每個fd 都嘗試去讀一下 防止阻塞住。
這個想法可行嗎? |
|