Gin
26.05.2010, 20:23
Суть простая тулза которая отчекивает заданный список доменов по ключевому слову. Я пока только разбираюсь в Builder так что сильно не пинайте, использую в проекте libcurl и многопоточность с помощью TTreads, проблема в том что приложение работает не совсем корректно, заносит в файлы good.txt и bad.txt не понятно каким образом ниже приведу код буду благодарен тем кто сможет помочь в отлове ошибки.
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#include <Unit1.h>
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
int max;
int count=0;
FILE* f1;
FILE* f2;
TStringList *DomainList = new TStringList;
static size_t Writer(char *data, size_t size,
size_t nmemb, AnsiString *buffer)
{
size_t result = 0;
if(buffer != NULL)
{
buffer->Insert(data,buffer->Length()+1);
//заполняем переменную buffer
result = size * nmemb;
// формируем значение количества переданных
//байт данных
}
return result;
}
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
__fastcall Thread::Thread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall Thread::Execute()
{
HINSTANCE cl = NULL;
if( ( cl = LoadLibrary( "libcurl.dll" ) ) == NULL )
MessageBox(NULL, "I can't load libcurl","ERROR", 0);
TStringList *tfile = new TStringList;
bool check=true;
FreeOnTerminate= true;
String data,url,filename;
EnterCriticalSection(&Form3->CS);
CURL *curl;
curl = curl_easy_init();
while(check){
if(count<max){
data="";
url="";
url= DomainList->Strings[count];
count++;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,Writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA,&data);
curl_easy_setopt(curl, CURLOPT_URL,url);
curl_easy_setopt(curl, CURLOPT_HEADER , 1 );
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_perform(curl);
LeaveCriticalSection(&Form3->CS);
//curl_easy_cleanup(curl);
tfile->Add(data);
filename= IntToStr(count)+".txt";
tfile->SaveToFile(filename);
tfile->Clear();
data.LowerCase();
Form3->Label1->Caption = url;//DomainList->Strings[count];
if(data.Pos("under construction")<0){
f1= fopen("good.txt","a+");
fputs(DomainList->Strings[count].c_str(),f1);
fputs("\n",f1);
fclose(f1);
}else{
f2= fopen("bad.txt","a+");
fputs(DomainList->Strings[count].c_str(),f2);
fputs("\n",f2);
fclose(f2);
}
}else{
FreeLibrary(cl);
check = false;
Terminate();
}
}
}
void __fastcall TForm3::Button1Click(TObject *Sender)
{
DomainList->LoadFromFile("domains.txt");
max= DomainList->Count-1;
InitializeCriticalSection(&CS);
Thread *T[3];
for(int i=0;i<3;i++){
T[i] = new Thread(false);
}
}
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#include <Unit1.h>
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
int max;
int count=0;
FILE* f1;
FILE* f2;
TStringList *DomainList = new TStringList;
static size_t Writer(char *data, size_t size,
size_t nmemb, AnsiString *buffer)
{
size_t result = 0;
if(buffer != NULL)
{
buffer->Insert(data,buffer->Length()+1);
//заполняем переменную buffer
result = size * nmemb;
// формируем значение количества переданных
//байт данных
}
return result;
}
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
__fastcall Thread::Thread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall Thread::Execute()
{
HINSTANCE cl = NULL;
if( ( cl = LoadLibrary( "libcurl.dll" ) ) == NULL )
MessageBox(NULL, "I can't load libcurl","ERROR", 0);
TStringList *tfile = new TStringList;
bool check=true;
FreeOnTerminate= true;
String data,url,filename;
EnterCriticalSection(&Form3->CS);
CURL *curl;
curl = curl_easy_init();
while(check){
if(count<max){
data="";
url="";
url= DomainList->Strings[count];
count++;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,Writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA,&data);
curl_easy_setopt(curl, CURLOPT_URL,url);
curl_easy_setopt(curl, CURLOPT_HEADER , 1 );
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_perform(curl);
LeaveCriticalSection(&Form3->CS);
//curl_easy_cleanup(curl);
tfile->Add(data);
filename= IntToStr(count)+".txt";
tfile->SaveToFile(filename);
tfile->Clear();
data.LowerCase();
Form3->Label1->Caption = url;//DomainList->Strings[count];
if(data.Pos("under construction")<0){
f1= fopen("good.txt","a+");
fputs(DomainList->Strings[count].c_str(),f1);
fputs("\n",f1);
fclose(f1);
}else{
f2= fopen("bad.txt","a+");
fputs(DomainList->Strings[count].c_str(),f2);
fputs("\n",f2);
fclose(f2);
}
}else{
FreeLibrary(cl);
check = false;
Terminate();
}
}
}
void __fastcall TForm3::Button1Click(TObject *Sender)
{
DomainList->LoadFromFile("domains.txt");
max= DomainList->Count-1;
InitializeCriticalSection(&CS);
Thread *T[3];
for(int i=0;i<3;i++){
T[i] = new Thread(false);
}
}