📄 multi_test.cpp
字号:
#include "stdafx.h"
#include "multi_test.h"
#include "afxmt.h"
//#include "afx.h"
#include "Winsock2.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MAX_THREADS 50 //最大线程数
CWinApp theApp;
using namespace std;
int ThreadNum = 0; //线程计数器
CCriticalSection CriticalSection; //线程同步对象
//定义线程参数结构
struct ThreadParam
{
int iPort; //被检测的端口号
int a,b,c,d; //ip地址的四个分段
};
int usage( void ); //使用帮助
UINT TestThread( LPVOID pParam ); //线程函数
//主程序
int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化MFC
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
//失败
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
//成功
else
{
if ( argc != 4 ){
usage();
exit(1);
}
char *pdest,psour[20];
int ch = '.';
int iStart1,iStart2,iStart3,iStart4;
//取出始地址的四个子段,分别放入iStart1到iStart4中
strcpy( psour, argv[1] );
pdest = strchr( psour, ch );
psour[ pdest - psour ] = '\0';
iStart1 = atoi( psour );
pdest[0] = '0';
strcpy( psour, pdest );
pdest = strchr( psour, ch );
psour[ pdest - psour ] = '\0';
iStart2 = atoi( psour );
pdest[0] = '0';
strcpy( psour, pdest );
pdest = strchr( psour, ch );
psour[ pdest - psour ] = '\0';
iStart3 = atoi( psour );
pdest[0] = '0';
iStart4 = atoi( pdest );
int iStop1,iStop2,iStop3,iStop4;
//取出尾地址的四个子段,,分别放入iStop1到iStop4中
strcpy( psour, argv[2] );
pdest = strchr( psour, ch );
psour[ pdest - psour ] = '\0';
iStop1 = atoi( psour );
pdest[0] = '0';
strcpy( psour, pdest );
pdest = strchr( psour, ch );
psour[ pdest - psour ] = '\0';
iStop2 = atoi( psour );
pdest[0] = '0';
strcpy( psour, pdest );
pdest = strchr( psour, ch );
psour[ pdest - psour ] = '\0';
iStop3 = atoi( psour );
pdest[0] = '0';
iStop4 = atoi( pdest );
//初始化WS2_32.DLL的调用
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 0 );
WSAStartup( wVersionRequested, &wsaData );
//依次扫描ip地址
for( int i = iStart1; i <= iStop1; i++ )
for( int j = iStart2; j <= iStop2; j++ )
for( int k = iStart3; k <= iStop3; k++ )
for( int l = iStart4; l <= iStop4; l++ )
{
//建立线程参数
ThreadParam *param = new ThreadParam;
param->iPort = atoi(argv[3]);
param->a = i;
param->b = j;
param->c = k;
param->d = l;
//判断当前线程数是否超过最大线程数,是则空循环
while( ThreadNum >= MAX_THREADS ){};
//线程计数加一
CriticalSection.Lock();
ThreadNum++;
CriticalSection.Unlock();
//开始线程
AfxBeginThread(TestThread, (LPVOID)param);
}
}
//判断所有线程是否结束,否则空循环等待
while( ThreadNum > 0 ){};
//所有线程结束,退出
printf("Scan Over!\n");
return nRetCode;
}
//使用帮助
int usage( void )
{
printf("usage: multi_test <start ip> <end ip> <port>\n");
exit(1);
}
//端口扫描的线程函数
UINT TestThread( LPVOID pParam )
{
char ip[16]; //用于存放ip地址
int iPort = ((ThreadParam *)pParam)->iPort; //被扫描端口号
sprintf(ip,"%d.%d.%d.%d",((ThreadParam *)pParam)->a,
((ThreadParam *)pParam)->b,((ThreadParam *)pParam)->c,
((ThreadParam *)pParam)->d); //将四个分段合并成ip地址
SOCKET WinSocket;
struct sockaddr_in local_sin;
//定义地址和端口
local_sin.sin_family = AF_INET;
local_sin.sin_port = htons(iPort);
local_sin.sin_addr.s_addr = inet_addr( ip );
printf("strating scan port %d on %s... \n", iPort, ip);
//建立socket套接字
if ((WinSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
printf( "Allocating socket failed. Error: %d\n", WSAGetLastError () );
//尝试建立连接,成功则显示端口开放
else{ if ((connect(WinSocket,(struct sockaddr *)&local_sin,sizeof(local_sin))) == 0)
printf( "%s port %d is open.\n", ip, iPort );
else printf( "%s port %d is not open.\n", ip, iPort );
}
closesocket( WinSocket );
//线程计数器减一
CriticalSection.Lock();
ThreadNum--;
CriticalSection.Unlock();
//线程结束
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -