www.pudn.com > QQ_Sniffer.rar > myState.cpp
#include "stdafx.h" #include "myState.h" #ifdef WIN32 #include#include typedef unsigned int u_int; #define LIBNET_LIL_ENDIAN 1 #else #include #endif #include #ifdef WIN32 long random(); void srandom(unsigned int); #endif CMyState g_objState; static u_char xor[12]; static u_char perm[12]; int gettimeofday(struct timeval *tv, struct timezone *tz) { struct _timeb tb; if(tv==NULL) return -1; _ftime(&tb); tv->tv_sec = tb.time; tv->tv_usec = ((int) tb.millitm) * 1000; return 0; } static void getrnd () { struct timeval s; u_int *ptr; gettimeofday (&s, 0); srandom (s.tv_usec); ptr = (u_int *) xor; *ptr = random (); *(ptr + 1) = random (); *(ptr + 2) = random (); ptr = (u_int *) perm; *ptr = random (); *(ptr + 1) = random (); *(ptr + 2) = random (); } void init_hash () { int i, n, j; int p[12]; getrnd (); for (i = 0; i < 12; i++) p[i] = i; for (i = 0; i < 12; i++) { n = perm[i] % (12 - i); perm[i] = p[n]; for (j = 0; j < 11 - n; j++) p[n + j] = p[n + j + 1]; } } u_int mkhash (u_int src, u_short sport, u_int dest, u_short dport) { u_int res = 0; int i; u_char data[12]; *(u_int *) (data) = src; *(u_int *) (data + 4) = dest; *(u_short *) (data + 8) = sport; *(u_short *) (data + 10) = dport; for (i = 0; i < 11; i++) res = ( (res << 8) + (data[perm[i]] ^ xor[i])) % 0xff100f; return res; } static int mk_hash_idx(struct tuple4 addr) { int hash=mkhash(addr.saddr, addr.source, addr.daddr, addr.dest); return hash % NUMBER_MAX; } CMyState::CMyState() { m_ppstState = NULL; } CMyState::~CMyState() { } void CMyState::InitHash() { init_hash(); m_ppstState = (hh_state **)malloc(sizeof(char*) * NUMBER_MAX); memset(m_ppstState, 0, sizeof(char*) * NUMBER_MAX); } void CMyState::AddState(hh_state * p) { int nIdx = mk_hash_idx(p->addr); p->prev = NULL; p->next = m_ppstState[nIdx]; if (m_ppstState[nIdx]) { m_ppstState[nIdx]->prev = p; } m_ppstState[nIdx] = p; } hh_state * CMyState::FindState(struct tuple4 addr, u_char proto) { int nIdx = mk_hash_idx(addr); hh_state *p = m_ppstState[nIdx]; while(p != NULL) { if (p->addr.source == addr.source && p->addr.saddr == addr.saddr && p->addr.dest == addr.dest && p->addr.daddr == addr.daddr && p->proto == proto) return p; p = p->next; } return NULL; } void CMyState::FreeState(struct tuple4 addr, u_char proto) { int nIdx = mk_hash_idx(addr); hh_state *p = m_ppstState[nIdx]; while(p != NULL) { if (p->addr.source == addr.source && p->addr.saddr == addr.saddr && p->addr.dest == addr.dest && p->addr.daddr == addr.daddr && p->proto == proto) { if (p != m_ppstState[nIdx]) { if (p->prev) p->prev->next = p->next; if (p->next) p->next->prev = p->prev; } else { if (p->next) { p->next->prev = NULL; m_ppstState[nIdx] = p->next; } else m_ppstState[nIdx] = NULL; } delete p; break; } p = p->next; } } void CMyState::freeState() { for (int i = 0; i < NUMBER_MAX; i ++) { hh_state *p = m_ppstState[i]; while(p != NULL) { hh_state *psttmp = p; p = p->next; delete psttmp; } } free(m_ppstState); }