SCP闄愰熼昏緫瀹炵幇--甯︿腑鏂囨敞閲婄殑bandwidth_limit鍑芥暟
SCP鏀寔闄愰? 閫氳繃-l鍙傛暟, 鎸囧畾鎷瘋礉鐨勯熷害
-l limit
Limits the used bandwidth, specified in Kbit/s.
鍏蜂綋瀹炵幇, 鏄湪misc.c涓殑bandwidth_limit鍑芥暟
涓嬮潰闄勪笂甯︿腑鏂囨敞閲婄殑bandwidth_limit鍑芥暟浠g爜
1 struct bwlimit {
2 size_t buflen; // 姣忔read鐨刡uf闀垮害
3 u_int64_t rate, thresh, lamt; // rate: 闄愰熼熺巼, 鍗曚綅kpbs
4 // thresh:緇熻鍛ㄦ湡,read闀垮害鍒頒簡鎸囧畾闃堝? 瑙﹀彂闄愰熺粺璁?br /> 5 // lamt: 涓嬈$粺璁″懆鏈熷唴, read浜嗗灝戦暱搴?/span>
6 struct timeval bwstart, bwend; // bwstart: 緇熻鍛ㄦ湡涔嬪紑濮嬫椂闂?br /> 7 // bwend: 緇熻鍛ㄦ湡涔嬬粨鏉熸椂闂?/span>
8 };
9
10 void bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
11 {
12 bw->buflen = buflen; // 鍒濆鍖杛ead buf闀垮害
13 bw->rate = kbps; // 鍒濆鍖栭檺閫熼熺巼
14 bw->thresh = bw->rate; // 鍒濆鍖栫粺璁″懆鏈?/span>
15 bw->lamt = 0; // 鍒濆鍖栧綋鍓峳ead闀垮害
16 timerclear(&bw->bwstart); // 鍒濆鍖栫粺璁″紑濮嬫椂闂?/span>
17 timerclear(&bw->bwend); // 鍒濆鍖栫粺璁$粨鏉熸椂闂?/span>
18 }
19
20 void bandwidth_limit(struct bwlimit *bw, size_t read_len)
21 {
22 u_int64_t waitlen;
23 struct timespec ts, rm;
24
25 // 璁劇疆緇熻寮濮嬫椂闂? 涓哄綋鍓嶆椂闂?/span>
26 if (!timerisset(&bw->bwstart)) {
27 gettimeofday(&bw->bwstart, NULL);
28 return;
29 }
30
31 // 璁劇疆褰撳墠read闀垮害
32 bw->lamt += read_len;
33 // 鍒ゆ柇褰撳墠read闀垮害鏄惁鍒拌揪緇熻鍛ㄦ湡鐨勯槇鍊?/span>
34 if (bw->lamt < bw->thresh)
35 return;
36
37 // 璁劇疆緇熻緇撴潫鏃墮棿,涓哄綋鍓嶆椂闂?/span>
38 gettimeofday(&bw->bwend, NULL);
39 // bwend鍙橀噺澶嶇敤, 榪欎釜鏃跺? bwend鍚箟涓? 鏈緇熻鍛ㄦ湡瀹為檯寮閿鐨勬椂闂? 鏃ead thresh闀垮害瀛楄妭,鑺變簡澶氬皯鏃墮棿.
40 timersub(&bw->bwend, &bw->bwstart, &bw->bwend);
41 if (!timerisset(&bw->bwend))
42 return;
43
44 // 灝嗗崟浣嶄粠Byte鍙樻垚bit
45 bw->lamt *= 8;
46 // 鏍規嵁闄愰熼熺巼, 璁$畻鐞嗚搴旇鑺辮垂澶氬皯鏃墮棿
47 waitlen = (double)1000000L * bw->lamt / bw->rate;
48 // bwstart鍙橀噺澶嶇敤, 榪欎釜鏃跺? bwstart鍚箟涓? 鏈緇熻鍛ㄦ湡鐞嗚寮閿鐨勬椂闂?/span>
49 bw->bwstart.tv_sec = waitlen / 1000000L;
50 bw->bwstart.tv_usec = waitlen % 1000000L;
51
52 // 濡傛灉鐞嗚寮閿鏃墮棿 > 瀹為檯寮閿鏃墮棿, 鍒欓渶瑕佸仛闄愰?/span>
53 if (timercmp(&bw->bwstart, &bw->bwend, >)) {
54 // bwend鍙橀噺澶嶇敤, 榪欎釜鏃墮棿, bwend鍚箟涓? 鐞嗚寮閿鏃墮棿 鍜?nbsp;瀹為檯寮閿鏃墮棿鐨勫樊鍊? 鏃㈤渶瑕乻leep鐨勬椂闂? 紜繚杈懼埌闄愰熷埌鎸囧畾鐨剅ate鍊?/span>
55 timersub(&bw->bwstart, &bw->bwend, &bw->bwend);
56
57 // 濡傛灉宸艱揪鍒頒簡縐掔駭, 鍒欓渶瑕侀檷浣庣粺璁″懆鏈熼槇鍊? 紜繚緇熻鐩稿綺劇‘
58 // thresh鍙樹負鍘熷厛鐨?/2, 浣嗕笉鑳戒綆浜巄uflen鐨?/4
59 if (bw->bwend.tv_sec) {
60 bw->thresh /= 2;
61 if (bw->thresh < bw->buflen / 4)
62 bw->thresh = bw->buflen / 4;
63 }
64 // 濡傛灉宸煎皬浜?0姣, 鍒欓渶瑕佸姞澶х粺璁″懆鏈熼槇鍊? 紜繚緇熻鐩稿綺劇‘
65 // thresh鍙樹負鍘熷厛鐨?鍊? 浣嗕笉鑳介珮浜巄uflen鐨?鍊?/span>
66 else if (bw->bwend.tv_usec < 10000) {
67 bw->thresh *= 2;
68 if (bw->thresh > bw->buflen * 8)
69 bw->thresh = bw->buflen * 8;
70 }
71
72 // 涔栦箹鐨勭潯涓浼氬惂, 浠ヨ揪鍒伴檺閫熺洰鐨?/span>
73 TIMEVAL_TO_TIMESPEC(&bw->bwend, &ts);
74 while (nanosleep(&ts, &rm) == -1) {
75 if (errno != EINTR)
76 break;
77 ts = rm;
78 }
79 }
80
81 // 鏂扮殑緇熻鍛ㄦ湡寮濮? 鍒濆鍖杔amt, bwstart鍙橀噺
82 bw->lamt = 0;
83 gettimeofday(&bw->bwstart, NULL);
84 }

]]>