⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multi_test.cpp

📁 随着计算机信息技术的飞速发展
💻 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 + -