青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

勤能補(bǔ)拙,Expter

成都游戲Coder,記錄游戲開發(fā)過程的筆記和心得!

關(guān)于會話記錄Session的實(shí)現(xiàn)

       Session的適用性很廣,翻譯為‘會話’,最初接觸他的時候在做web方面,可以記錄一個用戶的會話記錄,當(dāng)關(guān)閉瀏覽器的時候失效!Session實(shí)際上是一個特定的時間概念.

      在最開始接觸它時沒有刻意的研究實(shí)現(xiàn)與擴(kuò)展性,然后最近的一個工程有這樣的一個功能,就是統(tǒng)計(jì)最近5分鐘的流量。其實(shí)完全可以設(shè)計(jì)一個Session來記錄當(dāng)前的流量,然后設(shè)置超過5分鐘后的流量自動釋放。

       感覺起來像一個定時器,其實(shí)可以設(shè)置每個數(shù)據(jù)包的超時時間,即會話時間(Session),然后自動釋放與自動增加。

下面是實(shí)現(xiàn)代碼:
  1#pragma once
  2
  3/////////////////////////////////////////////////
  4//! 會話Session記錄模板
  5/////////////////////////////////////////////////
  6
  7#include <list>
  8using namespace std;
  9
 10#define  MAXTIME     1<<32
 11#define  FLAGLAY     true
 12
 13template<class Sessinfo>
 14class Session
 15{
 16
 17public:
 18
 19    // 默認(rèn)構(gòu)造函數(shù)
 20    Session()
 21        :M_lMaxHoldTime(MAXTIME)
 22        ,M_bAllowOverlay(FLAGLAY)
 23    {}
 24
 25    // 構(gòu)造函數(shù)
 26    Session(long MaxTime , bool bAllOverlay =  true)
 27        :M_lMaxHoldTime(MaxTime)
 28        ,M_bAllowOverlay(bAllOverlay)
 29    {}
 30
 31    // 只有一個會話記錄
 32    static Session   *Getinstance()
 33    {
 34        if( instance == NULL )
 35        {
 36           instance = new Session();
 37        }

 38        return instance;
 39    }

 40
 41    virtual ~Session(){}
 42
 43
 44public:
 45    // 增加一個新的會話
 46    // 如果不想使用構(gòu)造時定義的有效保持時間,可以根據(jù)用戶
 47    // 返回增加失敗與成功否。
 48
 49    bool AddSession(const Sessinfo &Info , int HoldTime = 0)
 50    {
 51        // 清理超時會話
 52        long Now_time = time(NULL);
 53        DealOutTime(Now_time);   
 54
 55        // 查找某個值,然后進(jìn)行操作
 56        for(list<ESession>::iterator it =Mlist_Session.begin() ; it != Mlist_Session.end();it++)
 57        {    
 58            if( comp(it->ENode , Info))
 59            {
 60                if(M_bAllowOverlay)     
 61                {
 62                    it = Mlist_Session.erase(it);
 63                    break;
 64                }

 65                else
 66                {
 67                    return false;
 68                }

 69            }

 70        }

 71        // 創(chuàng)建一個新的節(jié)點(diǎn)
 72        ESession NewSession;
 73        NewSession.ENode = Info;
 74        if(HoldTime != 0)
 75            NewSession.SEndTime = Now_time + HoldTime;
 76        else
 77            NewSession.SEndTime = Now_time + M_lMaxHoldTime;
 78
 79        // 如果沒有等待時間,表示處于長等狀態(tài)
 80        if(HoldTime != 0)
 81        {
 82            for(list<ESession>::iterator ite =Mlist_Session.begin(); ite !=Mlist_Session.end(); ite++)
 83            {
 84                if(ite->SEndTime > NewSession.SEndTime )
 85                {
 86                    if( Mlist_Session.begin() == ite)
 87                    {
 88                        Mlist_Session.push_front(NewSession);
 89                    }

 90                    else
 91                    {
 92                        Mlist_Session.insert(--ite,NewSession);
 93                    }

 94                    return true;
 95                }

 96            }

 97        }
    
 98        Mlist_Session.push_back(NewSession);
 99        return true;
100    }

101
102    // 驗(yàn)證一個拷貝會話,
103    // 驗(yàn)證一個會話,完成后是否刪除
104    bool TestCopySession(const Sessinfo & Info, bool bRemove = true)
105    {
106        // 清理超時會話
107        long Now_time = time(NULL);
108        DealOutTime(Now_time);   
109
110        // 查找某個值,然后進(jìn)行操作
111        for(list<ESession>::iterator it =Mlist_Session.begin() ; it != Mlist_Session.end(); it++)
112        {    
113            if(it->ENode == Info)
114            {
115                memmove(&Info,&(it->ENode),sizeof(Session));
116                if(bRemove)     
117                {
118                    it = Mlist_Session.erase(it);
119                    return true;
120                }

121            }

122        }

123        return false;
124    }

125    
126    void Run_ForEach(void (*Fun)(Sessinfo &,void *),void * lparam)
127    {
128        DealOutTime(time(NULL));
129        
130        for(list<ESession>::iterator it =Mlist_Session.begin() ; it != Mlist_Session.end(); it++)
131        {
132            (*Fun)(it->ENode,lparam);
133        }

134    }

135
136    friend ostream & operator << <>(ostream &out , const Session<Sessinfo> &sess);
137
138protected:
139    // 處理以及超時的結(jié)點(diǎn),然后刪除
140    void  DealOutTime(long Now_time)
141    {
142        // Mlist_Session有序列表,結(jié)束時間從前向后排列,
143        for(list<ESession>::iterator it=Mlist_Session.begin(); it != Mlist_Session.end(); )
144        {
145            if(it->SEndTime < Now_time)
146            {
147                it = Mlist_Session.erase(it);
148            }

149            else
150            {
151                return ;
152            }

153        }

154    }

155    
156private:
157    
158    // 會話元素
159    struct ESession
160    {
161        long        SEndTime;// 會話結(jié)束時間      
162        Sessinfo    ENode;   // 會話節(jié)點(diǎn)
163    }
;
164    
165    list<ESession>  Mlist_Session;          //   保存的會話元素的鏈表
166    long            M_lMaxHoldTime;            //   最大會話時間(秒),通過time來得到
167    bool            M_bAllowOverlay;        //   創(chuàng)建的會話已存在的時候時候覆蓋。
168    
169
170    static Session  *instance;
171}
;
172
173template<class Sessinfo>
174ostream & operator << (ostream &out , const Session<Sessinfo> &sess)
175{
176    for(list<Session<Sessinfo>::ESession>::const_iterator it = sess.Mlist_Session.begin() ; it != sess.Mlist_Session.end(); it++)
177    {
178        cout << *((int*)&(it->ENode)) <<" = "<< *(((int*)&(it->ENode))+1<<endl;
179    }

180    cout <<" ----------------------------------"<<endl;
181    return out;
182}

183
184
185/////////////////////////////////////////////////
186//! 會話Session類特化
187////////////////////////////////////////////////
188template<>
189class Session<int>
190{
191
192
193}
;

寫的一個實(shí)現(xiàn)代碼:
 1// MySession.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。
 2#include "Session.h"
 3#include <ctime>
 4#include <map>
 5#include <iostream>
 6#include <windows.h>
 7using namespace std;
 8
 9#define TIMER    5         // 10秒鐘 5分鐘
10
11struct TData
12{
13    int  data;
14    long time;
15}
;                     // 數(shù)據(jù)包
16bool comp (const TData & _data , const TData & _tdata)
17{
18    return ( (_tdata.data == _data.data) && (_tdata.time == _data.time));
19}

20
21int _tmain(int argc, _TCHAR* argv[])
22{
23    Session<TData>  Sess(TIMER);
24    
25    for(int count = 0 ; count < 20 ; count ++)
26    {
27        TData tmp;
28        tmp.data = count +1;
29        tmp.time = time(NULL);
30        Sess.AddSession(tmp,TIMER);
31        cout << Sess <<endl;
32        Sleep(500);
33    }

34    return 0;
35}

36
37

posted on 2009-04-22 20:53 expter 閱讀(1452) 評論(1)  編輯 收藏 引用 所屬分類: 其他學(xué)習(xí)筆記工作筆記算法與數(shù)據(jù)結(jié)構(gòu)

評論

# re: 關(guān)于會話記錄Session的實(shí)現(xiàn) 2009-04-28 13:30 guest

其實(shí)session在實(shí)際的開發(fā)中 運(yùn)用非常廣。。
封裝好了很方便的,  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情啪啪| 99亚洲精品| 欧美日韩国产大片| 午夜视频一区| 亚洲黄色成人| 欧美有码在线观看视频| 亚洲国产乱码最新视频| 国产精品毛片大码女人| 久久综合色88| 亚洲欧美日韩天堂| 亚洲另类在线一区| 欧美一区综合| 韩日在线一区| 欧美视频二区| 免费永久网站黄欧美| 性色一区二区三区| 99精品免费视频| 亚洲东热激情| 久久综合久久综合久久| 亚洲免费在线视频一区 二区| 亚洲国产欧美不卡在线观看| 国产精品一区二区视频| 欧美日韩第一页| 男女激情久久| 久久久噜噜噜久久狠狠50岁| 亚洲欧美www| 亚洲午夜激情网页| 亚洲日韩第九十九页| 另类图片综合电影| 亚洲欧美综合精品久久成人| 正在播放日韩| 亚洲乱码国产乱码精品精可以看| 伊人久久噜噜噜躁狠狠躁| 国产日韩欧美一区在线| 国产精品乱子久久久久| 欧美日韩视频在线第一区| 美女图片一区二区| 久久亚洲图片| 久久婷婷国产综合精品青草| 欧美在线视频不卡| 日韩视频中文| 亚洲免费黄色| 亚洲精品美女| 亚洲精品影院| 亚洲乱亚洲高清| 亚洲精品美女在线| 亚洲毛片av在线| 日韩视频在线你懂得| 亚洲麻豆视频| 一区二区三区视频在线观看| 99精品视频网| 中文在线不卡视频| 亚洲一区尤物| 午夜老司机精品| 欧美在线观看你懂的| 久久国产精品久久久久久| 性欧美长视频| 久久九九电影| 麻豆国产va免费精品高清在线| 久久手机免费观看| 欧美www视频| 欧美日韩国产一级片| 国产精品成人一区二区三区夜夜夜 | 欧美成黄导航| 欧美激情一区二区三区蜜桃视频 | 99精品久久| 一区二区三区高清在线 | 性色av一区二区三区在线观看| 亚洲免费在线观看视频| 亚洲男同1069视频| 久久福利一区| 免费在线观看日韩欧美| 欧美日韩在线另类| 国产精品五区| 狠狠色综合网| 日韩亚洲欧美在线观看| 亚洲综合电影一区二区三区| 久久精品视频在线观看| 欧美高清视频一区二区| 日韩视频免费观看| 亚洲欧美亚洲| 欧美jizz19hd性欧美| 欧美日韩亚洲综合一区| 欧美日韩精品一区二区| 国产精品日本欧美一区二区三区| 国产综合色在线| 亚洲毛片一区| 欧美在线视频不卡| 亚洲福利免费| 亚洲综合日韩中文字幕v在线| 久久影视三级福利片| 欧美性片在线观看| 在线观看亚洲精品| 亚洲午夜在线| 久久久久久网站| 亚洲日本在线视频观看| 欧美一区激情| 欧美日韩三级电影在线| 韩日精品在线| 亚洲欧美日本精品| 欧美成人免费全部| 亚洲女人av| 欧美精品福利视频| 国产在线国偷精品产拍免费yy| 99国产精品一区| 久久综合国产精品台湾中文娱乐网| 亚洲精品久久久久久久久| 久久国产精品色婷婷| 欧美日韩精品在线视频| 依依成人综合视频| 亚洲婷婷免费| 欧美激情亚洲视频| 欧美在线观看一区| 欧美日韩一级大片网址| 亚洲第一视频网站| 久久国内精品自在自线400部| 亚洲日韩欧美一区二区在线| 久久se精品一区二区| 国产精品theporn| 亚洲国产日韩欧美在线图片 | 久久亚洲图片| 亚洲午夜精品网| 欧美日韩国产精品一卡| 亚洲成人在线网站| 久久久久国产精品午夜一区| 亚洲国产精品一区二区尤物区| 校园激情久久| 国产乱人伦精品一区二区| 一区二区三区不卡视频在线观看 | 欧美成人免费网| 国产在线播放一区二区三区| 日韩午夜剧场| 欧美大成色www永久网站婷| 欧美在线短视频| 国产日韩欧美在线看| 午夜精品福利在线| 国产精品99久久久久久www| 欧美日韩国产美女| 日韩视频不卡| 久久一区精品| 亚洲综合精品四区| 国产精品私房写真福利视频 | 久久久精品999| 亚洲伊人网站| 国产免费成人| 亚洲欧美电影在线观看| 久久久久久伊人| 精品成人免费| 欧美激情视频在线播放| 欧美精品在线网站| 亚洲在线一区| 欧美影院在线| 亚洲精品日韩欧美| 亚洲最新视频在线播放| 国产酒店精品激情| 猫咪成人在线观看| 欧美精品成人在线| 午夜精品久久久99热福利| 久久xxxx精品视频| 亚洲激情小视频| 一区二区三区日韩欧美精品| 国产欧美视频一区二区| 欧美电影打屁股sp| 国产精品99免视看9| 久久久中精品2020中文| 欧美成人免费全部| 性久久久久久久久久久久| 久久精品国产久精国产一老狼| 亚洲精品久久久久久下一站| 亚洲香蕉视频| 亚洲国内欧美| 亚洲女同精品视频| 91久久中文| 翔田千里一区二区| 99国产精品久久| 午夜一区二区三视频在线观看 | 亚洲永久精品国产| 久久激五月天综合精品| 一本久久综合| 久久成人国产精品| 亚洲视频一区| 久久午夜精品| 性欧美8khd高清极品| 欧美高清在线一区二区| 欧美一区二区三区久久精品| 欧美国产在线观看| 欧美在线一级va免费观看| 欧美黄色免费网站| 老司机午夜精品视频在线观看| 欧美日韩一本到| 亚洲观看高清完整版在线观看| 国产日韩欧美视频| 夜夜嗨av一区二区三区| 亚洲国产精品成人va在线观看| 午夜精品久久久久久久白皮肤| 99精品视频免费观看视频| 久久伊人免费视频| 久久久水蜜桃av免费网站| 国产精品九色蝌蚪自拍| 亚洲人妖在线|