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