From 28b11c3ba1f94094949f1f2b32cb96e7678f24fd Mon Sep 17 00:00:00 2001 From: ChenLing Date: Mon, 15 Jul 2019 11:11:08 +0800 Subject: [PATCH] =?UTF-8?q?ADD=20=20aaa-12=20=E5=A2=9E=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=AE=A4=E8=AF=81=E7=9B=91=E6=8E=A7=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E5=8A=9F=E8=83=BD=20RCA?= =?UTF-8?q?=EF=BC=9A=20SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9=E4=BA=BA=EF=BC=9A?= =?UTF-8?q?chenling=20=E6=A3=80=E8=A7=86=E4=BA=BA=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Product/common/hlist.h | 136 ++++++++++++++++++++++++++++++++ Product/common/user_hashtable.c | 116 +++++++++++++++++++++++++++ Product/common/user_hashtable.h | 33 ++++++++ 3 files changed, 285 insertions(+) create mode 100644 Product/common/hlist.h create mode 100644 Product/common/user_hashtable.c create mode 100644 Product/common/user_hashtable.h diff --git a/Product/common/hlist.h b/Product/common/hlist.h new file mode 100644 index 000000000..0a6c002af --- /dev/null +++ b/Product/common/hlist.h @@ -0,0 +1,136 @@ +#ifndef __HLIST_H +#define __HLIST_H + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next, **pprev; +}; + +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#define HLIST_HEAD_INIT { .first = NULL } +#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } + +#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) + +static inline void INIT_HLIST_NODE(struct hlist_node *h) +{ + h->next = NULL; + h->pprev = NULL; +} + +static inline int hlist_unhashed(const struct hlist_node *h) +{ + return !h->pprev; +} + +static inline int hlist_empty(const struct hlist_head *h) +{ + return !h->first; +} + +static inline void __hlist_del(struct hlist_node *n) +{ + struct hlist_node *next = n->next; + struct hlist_node **pprev = n->pprev; + *pprev = next; + if (next) + next->pprev = pprev; +} + +static inline void hlist_del(struct hlist_node *n) +{ + __hlist_del(n); + n->next = NULL; + n->pprev = NULL; +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *first = h->first; + n->next = first; + if (first) + first->pprev = &n->next; + h->first = n; + n->pprev = &h->first; +} + + +static inline void hlist_del_init(struct hlist_node *n) +{ + if (!hlist_unhashed(n)) { + __hlist_del(n); + INIT_HLIST_NODE(n); + } +} + +static inline void hlist_add_before(struct hlist_node *n, + struct hlist_node *next) +{ + n->pprev = next->pprev; + n->next = next; + next->pprev = &n->next; + *(n->pprev) = n; +} + +static inline void hlist_add_after(struct hlist_node *n, + struct hlist_node *next) +{ + next->next = n->next; + n->next = next; + next->pprev = &n->next; + + if(next->next) + next->next->pprev = &next->next; +} + +static inline void hlist_move_list(struct hlist_head *old, + struct hlist_head *new) +{ + new->first = old->first; + if (new->first) + new->first->pprev = &new->first; + old->first = NULL; +} + +#define hlist_entry(ptr, type, member) container_of(ptr,type,member) + + +#define hlist_for_each_safe(pos, n, head) \ + for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ + pos = n) + +#define hlist_for_each_entry(tpos, pos, head, member) \ + for (pos = (head)->first; \ + pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +#define hlist_for_each_entry_continue(tpos, pos, member) \ + for (pos = (pos)->next; \ + pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +#define hlist_for_each_entry_from(tpos, pos, member) \ + for (; pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ + for (pos = (head)->first; \ + pos && ({ n = pos->next; 1; }) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = n) + + + +#endif + \ No newline at end of file diff --git a/Product/common/user_hashtable.c b/Product/common/user_hashtable.c new file mode 100644 index 000000000..a76226ca1 --- /dev/null +++ b/Product/common/user_hashtable.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include +#include +#include "hlist.h" +#include "user_hashtable.h" + +struct hlist_head *hash; +struct hlist_node *p = NULL, *n = NULL ; +int i = 0; +USER_INFO *pNode ; + +/*计算hash值 */ +struct hlist_head *call_hash(struct hlist_head *hash, uint32_t ip) +{ + unsigned int val = ip % 100; + return &hash[val]; +} + +/*初始化函数 */ +int Init_hash() +{ + hash = (struct hlist_head*)malloc(sizeof(*hash)*100); + if(NULL == hash) + { + printf("alloc error\n"); + return -1; + } + + for(i = 0; i < 100; i++) + INIT_HLIST_HEAD(&hash[i]); +} + + +/*查找用户信息*/ +struct user_info *ufind_user(uint32_t user_ip) +{ + hlist_for_each_safe(p,n,call_hash(hash,user_ip)) + { + pNode = hlist_entry(p, struct user_info ,hnode); + if(pNode != NULL) + printf("user_id :%d\n",pNode->id); + return pNode; + } +} + +/*增加用户信息*/ +int uadd_user(uint32_t user_ip, int user_id) +{ + USER_INFO *pNode =NULL; + hlist_for_each_safe(p,n,call_hash(hash, user_ip)) /*查找ip是否存在hash表中 */ + { + pNode = hlist_entry(p, struct user_info ,hnode); + if(pNode != NULL) + printf("IP ALEADY EXISTED\n"); + } + + if (pNode == NULL) + { + pNode = (struct user_info *)malloc(sizeof(struct user_info)); + if (NULL == pNode) + { + return -1; + } + memset(pNode,0,sizeof(struct user_info)); + INIT_HLIST_NODE(&pNode->hnode); + pNode->ip = user_ip; + hlist_add_head(&pNode->hnode, call_hash(hash, user_ip)); + } + pNode->id = user_id; + +} + +/*删除用户信息 */ +void udelete_user(int user_ip) +{ + hlist_for_each_safe(p,n,call_hash(hash,user_ip)) + { + pNode = hlist_entry(p, struct user_info ,hnode); + hlist_del(&pNode->hnode); + free(pNode); + } +} + +/*删除所有的hash节点 */ +void udelete_all() +{ + for(i = 0; i < 100; i++) + { + hlist_for_each_safe(p,n,&hash[i]) + { + pNode = hlist_entry(p, struct user_info ,hnode); + hlist_del(&pNode->hnode); + free(pNode); + } + } +} + +/*打印所有信息信息 */ +void uprintf_users() +{ + for(i = 0; i < 100; i++) + { + hlist_for_each_safe(p,n,&hash[i]) + { + char str[32]; + pNode = hlist_entry(p, struct user_info ,hnode); + if(pNode != NULL) + inet_ntop(AF_INET, (void *)&pNode->ip, str, 32); + printf("user_ip :%s user_id:%d\n", str, pNode->id); + } + } +} + diff --git a/Product/common/user_hashtable.h b/Product/common/user_hashtable.h new file mode 100644 index 000000000..4841d41c5 --- /dev/null +++ b/Product/common/user_hashtable.h @@ -0,0 +1,33 @@ +#ifndef K_HASHTABLE_H +#define K_HASHTABLE_H +#include +#include "hlist.h" + +typedef struct user_info{ + struct hlist_node hnode; + int id; + uint32_t ip; +}USER_INFO; + +/*计算hash值 */ +struct hlist_head *call_hash(struct hlist_head *hash, uint32_t ip); + +/*初始化函数 */ +int Init_hash(); + +/*查找用户信息*/ +struct user_info *ufind_user(uint32_t user_ip); + +/*增加用户信息*/ +int uadd_user(uint32_t user_ip, int user_id); + +/*删除用户信息 */ +void udelete_user(int user_ip); + +/*删除所有的hash节点 */ +void udelete_all(); + +/*打印所有信息信息 */ +void uprintf_users(); + +#endif \ No newline at end of file