Ticket #11537: IPLimit.h

File IPLimit.h, 3.3 KB (added by zzweng_2001@…, 7 years ago)
Line 
1#ifndef IPLIMIT_H
2#define IPLIMIT_H
3
4
5
6#include <boost/config.hpp>
7#include <algorithm>
8#include <boost/interprocess/allocators/allocator.hpp>
9#include <boost/interprocess/containers/string.hpp>
10#include <boost/interprocess/managed_mapped_file.hpp>
11#include <boost/interprocess/managed_shared_memory.hpp>
12#include <boost/interprocess/sync/scoped_lock.hpp>
13#include <boost/multi_index_container.hpp>
14#include <boost/multi_index/ordered_index.hpp>
15
16#include <boost/multi_index/hashed_index.hpp>
17#include <boost/multi_index/member.hpp>
18#include <boost/multi_index/composite_key.hpp>
19#include <boost/multi_index/identity.hpp>
20#include <iterator>
21#include <string>
22#include <iostream>
23#include <boost/interprocess/sync/scoped_lock.hpp>
24#include <boost/interprocess/sync/named_recursive_mutex.hpp>
25
26#include <vector>
27#include <pthread.h>
28
29namespace IPRateLimit
30{
31
32using boost::multi_index_container;
33using namespace boost::multi_index;
34namespace bip=boost::interprocess;
35
36
37typedef bip::managed_mapped_file::allocator<char>::type char_allocator;
38typedef bip::basic_string<char, std::char_traits<char>, char_allocator> shm_string;
39
40
41
42
43struct iprate
44{
45 uint32_t ip;
46 uint32_t countSec;
47 uint32_t countMin;
48 uint32_t countHour;
49 uint32_t countDay;
50 time_t tmSec;
51 time_t tmMin;
52 time_t tmHour;
53 time_t tmDay;
54 iprate()
55 {
56 ip = countSec = countMin = countHour = countDay = tmSec = tmMin = tmHour = tmDay = 0;
57 }
58};
59
60
61typedef multi_index_container<
62iprate,indexed_by<
63hashed_unique<BOOST_MULTI_INDEX_MEMBER(iprate,uint32_t,ip)>,
64ordered_non_unique<BOOST_MULTI_INDEX_MEMBER(iprate,uint32_t,countSec)>,
65ordered_non_unique<BOOST_MULTI_INDEX_MEMBER(iprate,uint32_t,countMin)>,
66ordered_non_unique<BOOST_MULTI_INDEX_MEMBER(iprate,uint32_t,countHour)>,
67ordered_non_unique<BOOST_MULTI_INDEX_MEMBER(iprate,uint32_t,countDay)>
68>,
69bip::allocator<iprate,bip::managed_mapped_file::segment_manager>
70> iprate_con;
71
72typedef boost::multi_index::nth_index<iprate_con,0>::type ipIdx;
73typedef boost::multi_index::nth_index<iprate_con,1>::type secCountIdx;
74typedef boost::multi_index::nth_index<iprate_con,2>::type minCountIdx;
75typedef boost::multi_index::nth_index<iprate_con,3>::type hourCountIdx;
76typedef boost::multi_index::nth_index<iprate_con,4>::type dayCountIdx;
77
78enum ENUM_TYPE
79{
80EIP=0,ESEC_COUNT=1,EMIN_COUNT=2,EHOUR_COUNT=3,EDAY_COUNT=4
81};
82
83
84class CIPLimit
85{
86public:
87 CIPLimit(const char *shm_name,const long count);
88 ~CIPLimit();
89 int init();
90 int incCount(uint32_t ip,iprate &data);
91 int getDataGreaterThan(int minNum,const ENUM_TYPE etype,std::vector<iprate> &data);
92
93 /*bool lock();
94 void unlock();
95 int destroyMutex();*/
96
97
98
99public:
100 static uint32_t IPStr2Int(const char* pStr);
101 static void IPInt2Str(uint32_t ip,char *pIP);
102 static void time2str(time_t t,std::string &str);
103
104private:
105 int getSecCountGreaterThan(int minNum,std::vector<iprate> &data);
106 int getMinCountGreaterThan(int minNum,std::vector<iprate> &data);
107 int getHourCountGreaterThan(int minNum,std::vector<iprate> &data);
108 int getDayCountGreaterThan(int minNum,std::vector<iprate> &data);
109protected:
110private:
111
112 iprate_con *con;
113 bip::named_recursive_mutex m_mutex;
114 bip::managed_mapped_file m_seg;
115 int maxCount;
116};
117}
118#endif // IPLIMIT_H