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

📄 portscan.cpp

📁 多线程扫描端口
💻 CPP
字号:
// portscan.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys\stat.h>
#include "scanport.h"

#define THREAD_NUM          60

//提示信息
void Usage();
//分析命令参数
void AnalyseCommandLines(int argc,char** argv);
bool WinSocket_Open ();  //window Socket库的初始化     
void WinSocket_Close();  //window Socket库的关闭

char Address[128];
unsigned int sPort = DEFAULT_BEGIN_PORT;
unsigned int ePort = DEFAULT_END_PORT;
unsigned int cPort = DEFAULT_END_PORT;
#define PortNum  ( ePort - sPort + 1)

HANDLE  ThreadHandleArray[THREAD_NUM];
DWORD count = THREAD_NUM ;
DWORD dwWait;
int _tmain(int argc, _TCHAR* argv[])
{
   
	WinSocket_Open();
	Usage();
    AnalyseCommandLines(argc,argv);
	CScanPort*  pScaner[THREAD_NUM]={NULL};
    //扫描的端口数少于线程数
    if ( PortNum <= THREAD_NUM )
	{
		 for (int i=0; i< (int)PortNum ;i++)
		 {
           pScaner[i] = new CScanPort(Address,sPort+i,sPort+i,i);  
		   ThreadHandleArray[i] =  pScaner[i]->hThread ;
		 }
		 count = PortNum;
	}
	else
	{
		 int sp = sPort,ep= sPort;
         int A = PortNum / THREAD_NUM ;  
		 int B = PortNum - A*THREAD_NUM; //余数
		 //把余数B细分到最多THREAD_NUM线程上
		 if ( B <= THREAD_NUM )
		 {
			 //把前B个线程加上1
		
			for (int i=0; i< THREAD_NUM; i++)
			{
				sp = ep;
				if ( i!= 0)
					sp +=1;
				ep = sp + A -1;

				if ( i < B)
					ep +=1;
									
				pScaner[i] = new CScanPort(Address,sp,ep,i); 
				ThreadHandleArray[i] =  pScaner[i]->hThread ;

			}
		 }
		 else
		 {
		    //把每个线程再加上Aa,最后一个线程加上Bb
		     int Aa = B / THREAD_NUM ; 
			 int Bb = B - Aa*THREAD_NUM;
			for (int i=0; i< THREAD_NUM; i++)
			{
				sp = ep;
				if ( i!= 0)
					sp +=1;
				ep = sp + A +Aa-1;
				if ( i == THREAD_NUM-1 ) 
				{
					ep = ep + Bb ;  
				}
				pScaner[i] = new CScanPort(Address,sp,ep,i); 
				ThreadHandleArray[i] =  pScaner[i]->hThread ;

		     }
		 }
			

	
	   

	}
   //等待直到最后一个线程结束
	while ( count )
	{
		dwWait = ::WaitForMultipleObjects( count, ThreadHandleArray, FALSE, INFINITE );
		if( dwWait >= WAIT_OBJECT_0 && dwWait < ( WAIT_OBJECT_0 + count ) )
		{
			dwWait -= WAIT_OBJECT_0;
			// dwWait now has index to thread that completed do whateve	you want to do with it
			// set array back up for next wait
			if( dwWait != ( count - 1 ) )
				ThreadHandleArray[ dwWait ] = ThreadHandleArray[count - 1 ];
				count--;
		    
		    
		}
	  printf ("--------------------------------------------Thread:%3d Complete\n",THREAD_NUM-count-1);

	}
	//显示结果
	printf ("--------------------------------------------------------------------------\n");
	printf ("Scan Address <%s> Open Port:\n",Address);
	struct Save ss;
	struct stat statbuf;
    FILE* fp ;
	fp = fopen ("port.txt","r");
    int res=stat("port.txt", &statbuf );
	if ( res == -1 ) return 0;
	int len = statbuf.st_size;
	int opennum = len /(sizeof (ss) );
	for (int i=0; i< opennum ;i++)
	{
         fread(&ss,1,sizeof (ss),fp);
		 fseek(fp,sizeof (ss)*(i+1), SEEK_SET  );
		 printf ("-> %5d \n", ss.port );
	}


    for (int n=0; n< THREAD_NUM; n++)
	{
		 if (  pScaner[n]  )
			 delete  pScaner[n];
	}

    WinSocket_Close();
	return 0;
}

void Usage()
{
  printf ("==========================================================================\n");
  printf ("PortScan v1.1 -TCP/IP Multi-Thread to Search Open Port\n");
  printf ("Free SoftWare\n");
  printf ("Email: check_815@sohu.com qq:14321410 tianya\n");
  printf ("==========================================================================\n");
} 
void AnalyseCommandLines(int argc,char** argv)
{
	
	//如果命令后没有参数,起用默认设置 ip:127.0.0.1 sPort:0 ePort 65534
	if (argc == 1)
	{
	
		printf ("portscan [IP | NAME] [Start Port] [End Port]\n");
		printf ("default ip:127.0.0.1 sPort:0 ePort 65534\n");
		exit(0);
		
	}
	else if ( argc ==2 )
	{
		 strcpy ( Address, argv[1] );
	}
	else if ( argc == 3)
	{
		 strcpy ( Address, argv[1] );
		 sPort = atoi( argv[2] );
	}
	else 
	{
		 strcpy ( Address, argv[1] );
		 sPort = atoi( argv[2] );
		 ePort = atoi( argv[3] );
	}
}
bool WinSocket_Open ()
{
	  WSADATA wsaData;
	  int err=WSAStartup(MAKEWORD(2,2),&wsaData);
	  return  (err==0? true:false) ;

}
void WinSocket_Close()
{
	 WSACleanup();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -