ОБСУЖДЕНИЕ

Сканер портов

6 ответов 5,4 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Здравствуйте. пишу сканер портов. Почемуто он выводит все заданные порты, несмотря на то что некоторые из них закрыты.
и во время работы приложение виснет, когда оно заканчивает сканирование, отвисает.
в чём может быть причина?

C++:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void scan()
{
TTreeNode * n;
Form1->ProgressBar1->Max = Form1->Memo1->Lines->Count;
Form1->ProgressBar2->Max = Form1->Memo2->Lines->Count;
for(int ip = 0; ip < Form1->Memo2->Lines->Count; ip++)
{
Form1->UdpSocket1->RemoteHost = Form1->Memo2->Lines->Strings[ip]; //ip udp
Form1->TcpClient1->RemoteHost = Form1->Memo2->Lines->Strings[ip];//ip tcp
n = Form1->TreeView1->Items->Add(Form1->TreeView1->Selected,Form1->Memo2->Lines->Strings[ip]);

for (int i = 0; i < Form1->Memo1->Lines->Count; i++)
{
Form1->UdpSocket1->RemotePort = StrToInt(Form1->Memo1->Lines->Strings[i]);
Form1->TcpClient1->RemotePort = StrToInt(Form1->Memo1->Lines->Strings[i]);
Form1->UdpSocket1->Active = true;
Form1->TcpClient1->Active = true;

if ((Form1->TcpClient1->Connect() && Form1->UdpSocket1->Connect()) || (Form1->TcpClient1->Connect() || Form1->UdpSocket1->Connect()))
{
Form1->TreeView1->Items->AddChild(n,Form1->Memo1->Lines->Strings[i]);
}
Form1->ProgressBar1->StepBy(i);
}
Form1->ProgressBar1->StepBy(ip);
}
Form1->ProgressBar1->StepBy(0);
Form1->ProgressBar2->StepBy(0);
Form1->Memo1->Lines->Clear();
Form1->Memo2->Lines->Clear();
ShowMessage("Сканирование завершено");
}

void stop()
{
Form1->TcpClient1->Active = false;
Form1->UdpSocket1->Active = false;
}
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
stop();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->TreeView1->Items->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N3Click(TObject *Sender)
{
scan();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
scan();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N4Click(TObject *Sender)
{
stop();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N2Click(TObject *Sender)
{
Form2 = new TForm2(Application);
Form2->ShowModal();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
if(Memo1->Text == "" && Memo2->Text == "")
{
Memo1->Lines->LoadFromFile("port.txt");
Memo2->Lines->LoadFromFile("ip.txt");
}
else
{
ShowMessage("Введите значения в Настройках");
Form2->ShowModal();
}
}
//---------------------------------------------------------------------------
 
Ree4
Если я не ошибаюсь эта тема про Builder. Общие вопросы не на этом основываются.
 
ну какбы это общий вопрос, если не ошибаюсь, и попрошу по теме
 
Это общий вопрос в теме С++ Builder, т.ч. будь добр перенеси его туда.
 
каким образом? я тут недавно
 
Ree4

чтобы приложение не подвисало, сканирование следует проводить в отдельном потоке и периодически аннонить GUI-часть для прогресса.

Почемуто он выводит все заданные порты, несмотря на то что некоторые из них закрыты.

честно говоря не увидел где само "сканирование", вот это что ли?

Form1->UdpSocket1->RemotePort = StrToInt(Form1->Memo1->Lines->Strings);
Form1->TcpClient1->RemotePort = StrToInt(Form1->Memo1->Lines->Strings);
Form1->UdpSocket1->Active = true;
Form1->TcpClient1->Active = true;

мде.

вот здесь - исходники правильного сканнера портов: http://nmap.org/

его даже Тринити в Матрице использовала для взлома терминала ((((:
 
вот, тип если подключился по порту, значит норм
C++:
 if ((Form1->TcpClient1->Connect() && Form1->UdpSocket1->Connect()) || (Form1->TcpClient1->Connect() || Form1->UdpSocket1->Connect()))
{
Form1->TreeView1->Items->AddChild(n,Form1->Memo1->Lines->Strings[i]);
}

Добавлено:
чтобы приложение не подвисало, сканирование следует проводить в отдельном потоке и периодически аннонить GUI-часть для прогресса.
это как? ты в коде можеш это изобразить?