#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); } } }