<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    SCP限速邏輯實現(xiàn)--帶中文注釋的bandwidth_limit函數(shù)

    SCP限速邏輯實現(xiàn)--帶中文注釋的bandwidth_limit函數(shù)

    SCP支持限速, 通過-l參數(shù), 指定拷貝的速度
     -l limit
                 Limits the used bandwidth, specified in Kbit/s.

    具體實現(xiàn), 是在misc.c中的bandwidth_limit函數(shù)
    下面附上帶中文注釋的bandwidth_limit函數(shù)代碼
     1 struct bwlimit {
     2     size_t buflen;                 // 每次read的buf長度
     3     u_int64_t rate, thresh, lamt;  // rate:  限速速率, 單位kpbs
     4                                    // thresh:統(tǒng)計周期,read長度到了指定閾值, 觸發(fā)限速統(tǒng)計
     5                                    // lamt:  一次統(tǒng)計周期內(nèi), read了多少長度
     6     struct timeval bwstart, bwend; // bwstart: 統(tǒng)計周期之開始時間
     7                                    // bwend:   統(tǒng)計周期之結(jié)束時間
     8 };
     9 
    10 void bandwidth_limit_init(struct bwlimit *bw, u_int64_t kbps, size_t buflen)
    11 {
    12     bw->buflen = buflen;          // 初始化read buf長度
    13     bw->rate = kbps;              // 初始化限速速率
    14     bw->thresh = bw->rate;        // 初始化統(tǒng)計周期
    15     bw->lamt = 0;                 // 初始化當(dāng)前read長度
    16     timerclear(&bw->bwstart);     // 初始化統(tǒng)計開始時間
    17     timerclear(&bw->bwend);       // 初始化統(tǒng)計結(jié)束時間
    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     // 設(shè)置統(tǒng)計開始時間, 為當(dāng)前時間
    26     if (!timerisset(&bw->bwstart)) {
    27         gettimeofday(&bw->bwstart, NULL);
    28         return;
    29     }
    30 
    31     // 設(shè)置當(dāng)前read長度
    32     bw->lamt += read_len;
    33     // 判斷當(dāng)前read長度是否到達統(tǒng)計周期的閾值
    34     if (bw->lamt < bw->thresh)
    35         return;
    36 
    37     // 設(shè)置統(tǒng)計結(jié)束時間,為當(dāng)前時間
    38     gettimeofday(&bw->bwend, NULL);
    39     // bwend變量復(fù)用, 這個時候, bwend含義為, 本次統(tǒng)計周期實際開銷的時間: 既read thresh長度字節(jié),花了多少時間.
    40     timersub(&bw->bwend, &bw->bwstart, &bw->bwend);
    41     if (!timerisset(&bw->bwend))
    42         return;
    43 
    44     // 將單位從Byte變成bit
    45     bw->lamt *= 8;
    46     // 根據(jù)限速速率, 計算理論應(yīng)該花費多少時間
    47     waitlen = (double)1000000L * bw->lamt / bw->rate;
    48     // bwstart變量復(fù)用, 這個時候, bwstart含義為, 本次統(tǒng)計周期理論開銷的時間
    49     bw->bwstart.tv_sec = waitlen / 1000000L;
    50     bw->bwstart.tv_usec = waitlen % 1000000L;
    51 
    52     // 如果理論開銷時間 >  實際開銷時間, 則需要做限速
    53     if (timercmp(&bw->bwstart, &bw->bwend, >)) {
    54         // bwend變量復(fù)用, 這個時間, bwend含義為, 理論開銷時間 和 實際開銷時間的差值, 既需要sleep的時間, 確保達到限速到指定的rate值
    55         timersub(&bw->bwstart, &bw->bwend, &bw->bwend);
    56 
    57         // 如果差值達到了秒級, 則需要降低統(tǒng)計周期閾值, 確保統(tǒng)計相對精確
    58         // thresh變?yōu)樵鹊?/2, 但不能低于buflen的1/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         // 如果差值小于10毫秒, 則需要加大統(tǒng)計周期閾值, 確保統(tǒng)計相對精確
    65         // thresh變?yōu)樵鹊?倍, 但不能高于buflen的8倍
    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         // 乖乖的睡一會吧, 以達到限速目的
    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     // 新的統(tǒng)計周期開始, 初始化lamt, bwstart變量
    82     bw->lamt = 0;
    83     gettimeofday(&bw->bwstart, NULL);
    84 }

    posted on 2014-09-22 17:45 stone2083 閱讀(2477) 評論(4)  編輯  收藏 所屬分類: c

    Feedback

    # re: SCP限速邏輯實現(xiàn)--帶中文注釋的bandwidth_limit函數(shù) 2014-09-23 15:53 提升機

    學(xué)習(xí)了,多謝分享  回復(fù)  更多評論   

    # re: SCP限速邏輯實現(xiàn)--帶中文注釋的bandwidth_limit函數(shù) 2014-09-23 20:40 名皮網(wǎng)

    收藏了。多謝分享  回復(fù)  更多評論   

    # re: SCP限速邏輯實現(xiàn)--帶中文注釋的bandwidth_limit函數(shù) 2014-09-30 09:36 sjxifen

    怎樣用的呢?  回復(fù)  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品无码久久久| 日韩a级毛片免费观看| 国产亚洲人成无码网在线观看| 色五月五月丁香亚洲综合网| 免费看的成人yellow视频| 337p日本欧洲亚洲大胆人人| 国产一级一片免费播放| 免费无遮挡无码视频在线观看| 亚洲成A人片在线观看无码3D| 一个人看的在线免费视频| 国产亚洲欧洲Aⅴ综合一区 | 国产无遮挡裸体免费视频在线观看| 亚洲一区二区高清| a级毛片高清免费视频| 亚洲AV无码精品色午夜果冻不卡 | 在线视频免费观看高清| 亚洲av成人无码网站…| 亚洲精品偷拍视频免费观看| 两个人看www免费视频| 亚洲综合久久1区2区3区| 一二三四在线观看免费高清中文在线观看 | 亚洲av综合av一区二区三区| 免费永久在线观看黄网站| 国产真人无码作爱免费视频| 久久久久亚洲精品无码蜜桃| 免费看www视频| 黄页免费在线观看| 亚洲第一男人天堂| 亚洲真人日本在线| 37pao成人国产永久免费视频 | 免费网站观看WWW在线观看| 亚洲日产2021三区| 免费大片在线观看网站| 国产成人AV片无码免费| 亚洲中文字幕AV每天更新| 亚洲美女人黄网成人女| 国产女高清在线看免费观看| 两个人看的www高清免费视频 | 国产黄在线播放免费观看| 亚洲综合无码一区二区三区| 亚洲高清偷拍一区二区三区 |