www.pudn.com > FindMail.zip > FindMailThread.cpp


#include "StdAfx.h" 
#include "findmailthread.h" 
#include "util.h" 
 
DWORD WINAPI ThreadFindMail(PVOID pParam); 
 
CFindMailThread::CFindMailThread(void) 
: m_f_stop(0) 
, m_f_stopped(0) 
, m_thread_num(0) 
, m_start_pos(0) 
, m_sleep_sec(60) 
{ 
	m_hThread =NULL; 
	m_pch ="\0abcdefghijklmnopqrstuvwxyz0123456789"; 
	m_pch_len =(int)strlen(m_pch+1)+1; 
	m_pdict_buf =NULL; 
	m_dict_lines_count =0; 
	m_max_thread_count =1; 
} 
 
int CFindMailThread::Init(char *domain_name, char *mx_server, char *outfile_exist, char *outfile_nonexist, int thread_num, int max_thread_count, int start_pos, char **pdict_buf, int dict_lines_count, int sleep_sec) 
{ 
	m_thread_num =thread_num; 
	m_max_thread_count =max_thread_count; 
	m_cur_pos =m_start_pos =start_pos; 
	m_pdict_buf =pdict_buf; 
	m_dict_lines_count =dict_lines_count; 
	m_sleep_sec =sleep_sec; 
 
	strcpy(m_smtp_client.m_domain_name, domain_name); 
	strcpy(m_smtp_client.m_host, mx_server); 
	strcpy(m_outfile_exist, outfile_exist); 
	strcpy(m_outfile_nonexist, outfile_nonexist); 
	 
	return 0; 
} 
 
CFindMailThread::~CFindMailThread(void) 
{ 
	Stop(); 
} 
 
int CFindMailThread::Start(void) 
{ 
	DWORD id; 
 
	Stop(); 
 
	m_f_stopped =false; 
	m_f_stop =false; 
 
	if((m_hThread =CreateThread(NULL, 0, ThreadFindMail, this, 0, &id)) ==NULL) 
		return -1; 
 
	return 0; 
} 
 
int CFindMailThread::Stop(void) 
{ 
	m_f_stop =true; 
 
	if(m_hThread !=NULL) 
	{ 
		// WaitForSingleObject(... 
		if(m_f_stopped ==false) 
			TerminateThread(m_hThread, 0); 
		CloseHandle(m_hThread); 
		m_hThread =NULL; 
	} 
 
	return 0; 
} 
 
// fill buf 
int CFindMailThread::CheckRandom(char *name, int buf_pos, int pch_pos, int count) 
{ 
	for(int i =pch_pos; i2) i =27; 
 
		name[buf_pos] =m_pch[i]; 
		if(buf_pos >0) 
		{ 
			count =CheckRandom(name, buf_pos-1, (i>0)?1:0, count); 
		} 
		else 
		{ 
			if(i >0) 
			{ 
				//int len =(int)strlen(name); 
				if(count >= m_start_pos && (count %m_max_thread_count ==m_thread_num)) 
				{ 
					if(name[3] ==0) 
						CheckMail(count, name); 
					else if(name[0] <'0' || name[0] >'9') 
					{ 
						for(i =3; i<(int)strlen(name); i++) 
							if(name[i] >'9' || name[i] <'0') break; 
						if(i ==(int)strlen(name)) 
							CheckMail(count, name); 
						else Sleep(100); 
						//WriteStat("%d : %s", m_thread_num, name); 
						//Sleep(1000); 
					} 
					else Sleep(100); 
				} 
				//WriteLog("%d:%s,buf_pos:%d, i:%d", count, name, buf_pos, i); 
			} 
			//memset(name, 0, len); 
			m_cur_pos =count; 
			count++; 
 
		} 
	} 
 
	return count; 
} 
 
int CFindMailThread::CheckMail(int count, char *name) 
{ 
	if(m_f_stop) return 0; 
	int ret; 
	char email_addr[100]; 
 
	wsprintf(email_addr, "%s@%s", name, m_smtp_client.m_domain_name); 
	if(count%7 ==0) 
	{ 
Reconnect: 
		m_smtp_client.Disconnect(); 
		while(!m_f_stop) 
		{ 
			if((ret =m_smtp_client.ConnectHost()) >=0) break; 
			Sleep(1000*m_sleep_sec); 
		} 
		if(m_f_stop) return 0; 
		 
		if(m_smtp_client.From(NULL) !=0) goto Reconnect; 
	} 
	ret =m_smtp_client.Rcpt(email_addr); 
	if(ret <0) goto Reconnect; 
	if(ret ==0) 
		WriteExistEmail(m_outfile_exist, email_addr); 
	else if(ret ==SMTP_INVALID_USER) WriteNonexistEmail(m_outfile_nonexist, email_addr); 
	else goto Reconnect; 
	//m_cur_pos =count-1; 
 
	return 0; 
} 
 
DWORD WINAPI ThreadFindMail(PVOID pParam) 
{ 
	CFindMailThread *pfindmail =(CFindMailThread *)pParam; 
	 
	char name[21]; 
 
	while(!pfindmail->m_f_stop) 
	{ 
		memset(name, 0, sizeof(name)); 
		if(pfindmail->m_dict_lines_count >0) 
			pfindmail->CheckDict(); 
		pfindmail->CheckRandom(name, 19, 0, 0); 
	} 
	pfindmail->m_f_stopped =true; 
 
	return 0; 
} 
 
int CFindMailThread::CheckDict(void) 
{ 
	for(int i =m_thread_num; i=m_start_pos) CheckMail(i, m_pdict_buf[i]); 
 
	return 0; 
}