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