锘??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩av一区二区三区在线观看,久久亚洲精华国产精华液,久草在现在线http://www.aygfsteel.com/stone2083/category/54540.htmlzh-cnMon, 22 Sep 2014 09:52:44 GMTMon, 22 Sep 2014 09:52:44 GMT60SCP闄愰熼昏緫瀹炵幇--甯︿腑鏂囨敞閲婄殑bandwidth_limit鍑芥暟http://www.aygfsteel.com/stone2083/archive/2014/09/22/418166.htmlstone2083stone2083Mon, 22 Sep 2014 09:45:00 GMThttp://www.aygfsteel.com/stone2083/archive/2014/09/22/418166.htmlhttp://www.aygfsteel.com/stone2083/comments/418166.htmlhttp://www.aygfsteel.com/stone2083/archive/2014/09/22/418166.html#Feedback0http://www.aygfsteel.com/stone2083/comments/commentRss/418166.htmlhttp://www.aygfsteel.com/stone2083/services/trackbacks/418166.htmlSCP闄愰熼昏緫瀹炵幇--甯︿腑鏂囨敞閲婄殑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 }


stone2083 2014-09-22 17:45 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 阿克陶县| 济阳县| 开原市| 玉田县| 锦州市| 全州县| 增城市| 石嘴山市| 义马市| 吴桥县| 鱼台县| 德令哈市| 济宁市| 常山县| 罗甸县| 乌什县| 敦煌市| 平山县| 旬邑县| 尼勒克县| 绿春县| 揭东县| 镇赉县| 酒泉市| 察雅县| 龙泉市| 江安县| 大洼县| 得荣县| 津南区| 奉新县| 福海县| 潢川县| 右玉县| 康马县| 陕西省| 东山县| 澄迈县| 东至县| 江源县| 宁海县|