//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ScanProt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
bool StopFlag;
//==============================================================================
//线程类,用于端口扫描
//==============================================================================
__fastcall TScanPortThread::TScanPortThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
// FStopFlag = false;
FStartPort = 0;
FEndPort = 0;
FCurrPort = 0;
FOnScanResult = NULL;
FHostMsg = NULL;
}
__fastcall TScanPortThread::~TScanPortThread(void)
{
Suspend();
Terminate();
closesocket(FSock);
}
void __fastcall TScanPortThread::Execute(void)
{
while(!StopFlag)
{
if(FCurrPort > FEndPort)
{
Suspend();
Terminate();
}
// Synchronize(ThreadScan);
ThreadScan();
}
}
void __fastcall TScanPortThread::ThreadScan(void)
{
if(FCurrPort > FEndPort)
{
Suspend();
Terminate();
return;
}
int result;
result = SERVERConn();
if(result != SCAN_UNFINDPORT && result != SCAN_OK)
{
Suspend();
Terminate();
return;
}
FResult = (result == SCAN_OK);
Synchronize(OutProg);
FCurrPort++;
}
void __fastcall TScanPortThread::Suspend(void)
{
TThread::Suspend();
closesocket(FSock);
}
void __fastcall TScanPortThread::OutProg(void)
{
if(FOnScanResult != NULL)
FOnScanResult(FCurrPort, FResult);
}
//返回ture表示成功,返回false表示扫描失败
BOOL __fastcall TScanPortThread::Scan(void)
{
bool flag;
StopFlag = false;
if(FHostMsg == NULL)
{
ShowMessage("没有设置主机名!");
return false;
}
FCurrPort = FStartPort;
Resume();
return true;
}
//连接函数,hostent结构见帮助
int __fastcall TScanPortThread::SERVERConn(void)
{
SOCKADDR_IN Sock_in; //结构见帮助
BOOL RetMsg;
ZeroMemory(&Sock_in, sizeof(SOCKADDR_IN));
//连接类型
Sock_in.sin_family = AF_INET;
//所连接的主机端口
Sock_in.sin_port = htons(FCurrPort);
//主机地址赋予结构以便下面调用
memcpy(&(Sock_in.sin_addr), FHostMsg->h_addr_list[0], sizeof(in_addr));
//所连接的主机端口 memcpy(&(Sock_in.sin_addr),FHostMsg->h_addr,sizeof(Sock_in.sin_addr)); //主机地址赋予结构以便下面调用
// Application->ProcessMessages();
if((FSock = (socket(AF_INET, SOCK_STREAM, 0))) == SOCKET_ERROR)
{ //SOCKET函数见帮助
ShowMessage("SOCKET错误");
closesocket(FSock);
WSACleanup();
FHostMsg = NULL;
return SCAN_SOCKETERROR;
}
if((connect(FSock, (LPSOCKADDR)&Sock_in, sizeof(Sock_in))) == SOCKET_ERROR)
{ //开始连接并判断是否成功
closesocket(FSock);
return SCAN_UNFINDPORT;
}
else
{
//不许端口接收,发送数据但保持连接状态 closesocket(SERSock);
//成功后马上关闭,以免。。。
closesocket(FSock);
shutdown(FSock, 0);
return SCAN_OK;
}
}
//停下所有的线程和其工作
void __fastcall TScanPortThread::Stop(void)
{
Suspend();
}
//==============================================================================
//端口扫描类
//==============================================================================
__fastcall TScanPort::TScanPort(TScanResultEvent event)
{
ScanThreads = NULL;
OnScanResult = event;
FThreadNums = 0;
}
__fastcall TScanPort::~TScanPort(void)
{
Stop();
for(int i = 0; i < FThreadNums; i++)
delete ScanThreads[i];
delete[] ScanThreads;
}
//返回ture表示成功,返回false表示扫描失败
BOOL __fastcall TScanPort::Scan(void)
{
bool flag;
for(int j = 0; j < FThreadNums; j++)
{
ScanThreads[j]->Scan();
}
return true;
}
int __fastcall TScanPort::SetParam(AnsiString HostName, int startPort, int endPort, int threadNums)
{
hostent *hostMsg;
WSADATA wsaData; //WSADATA结构见帮助
if(WSAStartup(MAKEWORD(1, 1), &wsaData) != NULL) //以WINSOCK1.1协议初始化
{
ShowMessage("初始化WINSOCK错误");
WSACleanup();
hostMsg = NULL;
return SCAN_INITERROR;
}
hostMsg = gethostbyname(HostName.c_str()); //获取主机信息
if(!hostMsg)
{
ShowMessage("主机名称错误,请检查IP地址");
WSACleanup();
hostMsg = NULL;
return SCAN_IPERROR;
}
if(endPort == 0)
endPort = startPort;
int dl1 = endPort - startPort + 1;
int dl;
int yl = 0;
if(threadNums > 0)
{
yl = dl1 % threadNums;
if(yl == 0)
{
dl = dl1 / threadNums;
yl = dl - 1;
}
else
{
dl = dl1 / threadNums + 1;
threadNums = dl1 / dl + 1;
yl = dl - (threadNums * dl - dl1) - 1;
}
}
SetThreadNums(threadNums);
for(int j = 0; j < threadNums; j++)
{
if(j == threadNums - 1)
{
ScanThreads[j]->StartPort = startPort + j * dl;
ScanThreads[j]->EndPort = ScanThreads[j]->StartPort + yl;
}
else
{
ScanThreads[j]->StartPort = startPort + j * dl;
ScanThreads[j]->EndPort = ScanThreads[j]->StartPort + dl - 1;
}
ScanThreads[j]->HostMsg = hostMsg;
ScanThreads[j]->OnScanResult = OnScanResult;
}
return SCAN_OK;
}
int __fastcall TScanPort::SetParamIP(AnsiString IP, int startPort, int endPort, int threadNums)
{
hostent *hostMsg;
WSADATA wsaData; //WSADATA结构见帮助
if(WSAStartup(MAKEWORD(1, 1), &wsaData) != NULL) //以WINSOCK1.1协议初始化
{
ShowMessage("初始化WINSOCK错误");
WSACleanup();
hostMsg = NULL;
return SCAN_INITERROR;
}
char addr[4];
int p = IP.Pos(".");
int index = 0;
while(p != 0)
{
addr[index] = IP.SubString(1, p - 1).ToInt();
index++;
IP = IP.SubString(p + 1, IP.Length() - p);
p = IP.Pos(".");
}
addr[index] = IP.ToInt();
if(index != 3)
{
ShowMessage("主机名称错误,请检查IP地址");
return SCAN_IPERROR;
}
hostMsg = gethostbyaddr(&addr[0], 4, AF_INET); //获取主机信息
if(!hostMsg)
{
ShowMessage("主机名称错误,请检查IP地址");
WSACleanup();
hostMsg = NULL;
return SCAN_IPERROR;
}
if(endPort == 0)
endPort = startPort;
SetThreadNums(threadNums);
int dl1 = endPort - startPort + 1;
int dl;
int yl = 0;
if(threadNums > 0)
{
yl = dl1 % threadNums;
if(yl == 0)
{
dl = dl1 / threadNums;
yl = dl - 1;
}
else
{
dl = dl1 / threadNums + 1;
threadNums = dl1 / dl + 1;
yl = dl - (threadNums * dl - dl1) - 1;
}
}
for(int j = 0; j < threadNums; j++)
{
if(j == threadNums - 1)
{
ScanThreads[j]->StartPort = startPort + j * dl;
ScanThreads[j]->EndPort = ScanThreads[j]->StartPort + yl;
}
else
{
ScanThreads[j]->StartPort = startPort + j * dl;
ScanThreads[j]->EndPort = ScanThreads[j]->StartPort + dl - 1;
}
ScanThreads[j]->HostMsg = hostMsg;
ScanThreads[j]->OnScanResult = OnScanResult;
}
return SCAN_OK;
}
void __fastcall TScanPort::SetThreadNums(int threadNums)
{
Stop();
for(int i = 0; i < FThreadNums; i++)
{
delete ScanThreads[i];
}
delete[] ScanThreads;
FThreadNums = threadNums;
ScanThreads = (TScanPortThread**)new long[FThreadNums];
for(int j = 0; j < FThreadNums; j++)
{
ScanThreads[j] = new TScanPortThread(true);
}
}
//停下所有的线程和其工作
void __fastcall TScanPort::Stop(void)
{
for(int j = 0; j < FThreadNums; j++)
{
ScanThreads[j]->Suspend();
ScanThreads[j]->Terminate();
}
}
BOOL ServerBrowser(HWND hWndParent,AnsiString &compName)
{
compName = "";
CHAR CompName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD dwBufLen = sizeof(CompName)/sizeof(CHAR);
PROCSERVERBROWSEIALOG ServerBrowseDialog;
BOOL bOK;
HINSTANCE hLibrary;
DWORD dwError;
端口线程扫描程序(附源码BCB5)
需积分: 50 109 浏览量
2006-02-23
09:05:59
上传
评论
收藏 24KB RAR 举报
普通网友
- 粉丝: 882
- 资源: 2万+