64,654
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include "scan.h"
using namespace std;
int main()
{
scan scanObject;
scanObject.StartScan();
return 0;
}
// scan.h: interface for the scan class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCAN_H__613A1F5B_4209_4661_B721_1B2F90BBE379__INCLUDED_)
#define AFX_SCAN_H__613A1F5B_4209_4661_B721_1B2F90BBE379__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
#include <process.h>
typedef struct _SCAN_INFO
{
unsigned long ulStartP;
unsigned long ulEndIP;
}SCAN_INFO,*PSCAN_INFO;
typedef struct _SCAN_RESULT
{
char szIP[16];
int nPort;
}SCAN_RESULT,*PSCAN_RESULT;
void CheckMallocFailure(PVOID pBuf);
class scan
{
public:
scan();
virtual ~scan();
BOOL StartScan();
private:
unsigned long m_ulStartIP;
unsigned long m_ulEndIP;
int m_nSetThreadCount;
int m_nThreadCount;
unsigned short m_usStartPort;
unsigned short m_usEndPort;
int m_nMaxThreadCount;//当设置的线程数超过最大数后只用最大数个线程扫描
int m_nMinIPCount;//当少于这么多扫描项 无论设置为多少线程数都只用一个线程扫描
char szStartIP[16];
char szEndIp[16];
protected:
BOOL SetStarIP();
BOOL SetEndIP();
BOOL SetThreaqdCount();
BOOL SetStartPort();
BOOL SetEndPort();
int DetermineThreadCount();
unsigned long TurnIP(char *szIP);
BOOL ResolveIPString(char *szIPString,char *szString,int nCount);//分解IP字符串
BOOL DispatchScan();//为各个线程分派任务
private:
DWORD WINAPI ScanThreadProc(LPVOID lpParam);
};
#endif // !defined(AFX_SCAN_H__613A1F5B_4209_4661_B721_1B2F90BBE379__INCLUDED_)
// scan.cpp: implementation of the scan class.
//
//////////////////////////////////////////////////////////////////////
#include <iostream>
#include <WINSOCK2.H>
#pragma comment(lib,"WS2_32")
#include "scan.h"
using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
typedef unsigned int(_stdcall *PTHREAD_START)(void *);
scan::scan()
{
m_ulEndIP = 0;
m_ulStartIP = 0;
m_nSetThreadCount = 1;
m_usEndPort = 0;
m_usStartPort = 0;
m_nMaxThreadCount = 10;
m_nMinIPCount = 10000;
WSAData wsaData;
WORD wSockVersion = MAKEWORD(2,2);
WSAStartup(wSockVersion,&wsaData);
}
scan::~scan()
{
WSACleanup();
}
BOOL scan::SetStarIP()
{
cout<<"请输入起始IP地址:";
cin>>szStartIP;
return TRUE;
}
BOOL scan::SetEndIP()
{
cout<<"请输入结束IP地址:";
cin>>szEndIp;
return TRUE;
}
BOOL scan::SetThreaqdCount()
{
cout<<"请输入您想启动的线程数:";
cin>>m_nSetThreadCount;
return TRUE;
}
BOOL scan::SetStartPort()
{
cout<<"请输入起始端口号:";
cin>>m_usStartPort;
return TRUE;
}
BOOL scan::SetEndPort()
{
cout<<"请输入结束端口号:";
cin>>m_usEndPort;
return TRUE;
}
BOOL scan::StartScan()
{
SetStarIP();
SetEndIP();
SetStartPort();
SetEndPort();
SetThreaqdCount();
m_usStartPort = TurnIP(szStartIP);
m_usEndPort = TurnIP(szEndIp);
m_nThreadCount = DetermineThreadCount();
return TRUE;
}
BOOL scan::DispatchScan()
{
int nIPCount = 0;
nIPCount = (m_usEndPort - m_usStartPort)/m_nThreadCount;
for (int i = 0 ; i < m_nThreadCount; i++)
{
PSCAN_INFO scanpInfo;
scanpInfo = (PSCAN_INFO)malloc(sizeof(SCAN_INFO));
CheckMallocFailure(scanpInfo);
scanpInfo->ulStartP = m_usStartPort + nIPCount * i;
scanpInfo->ulEndIP = scanpInfo->ulStartP + nIPCount - 1;
HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,(PTHREAD_START)ScanThreadProc,NULL,CREATE_SUSPENDED,NULL);
}
return TRUE;
}
int scan::DetermineThreadCount()
{
if ((m_usEndPort - m_usStartPort)*(m_usEndPort - m_usStartPort)<1000)
{
return m_nThreadCount;
}
if (m_nSetThreadCount > m_nMaxThreadCount)
{
return m_nMaxThreadCount;
}
return m_nSetThreadCount;
}
unsigned long scan::TurnIP(char *szIP)
{
char szIpField[4][4] = {0};
unsigned long ulIPadd = 0;
BYTE bIP[4] = {0};
for (int i = 0;i < 4; i++)
{
ResolveIPString(szIP,szIpField[i],i+1);
int nTemp = atoi(szIpField[i]);
bIP[i] = (BYTE)nTemp;
}
ulIPadd = (bIP[0]<<24) + (bIP[1]<<16) + (bIP[2]<<8) + (bIP[3]<<3);
return ulIPadd;
}
BOOL scan::ResolveIPString(char *szIPString,char *szString,int nCount)
{
int nTemp = 0;
while (TRUE)
{
if (*szIPString == '.')
{
nTemp++;
szIPString++;
}
if (nTemp == nCount||*szIPString == '\0')
{
break;
}
if (nTemp == nCount -1)
{
*szString = *szIPString;
szString++;
}
szIPString++;
}
return TRUE;
}
void CheckMallocFailure(PVOID pBuf)
{
if (!pBuf)
{
MessageBox(NULL,TEXT("分配内存出错!"),TEXT("错误!"),MB_OK);
exit(1);
}
}
DWORD WINAPI scan::ScanThreadProc(LPVOID lpParam)
{
return 0;
}