做一个端口扫描器 如何实现多线程扫描?

mixdd 2010-06-10 04:28:47
设定100个线程扫描,每个ip开辟一个线程扫描,当一个线程扫描一个ip结束时候,自动开辟一个新的线程

维持100个线程的数量不变

查了资料 说要用线程池 谁可以帮忙详细的介绍下?

最好有个源代码介绍更好 谢谢!
...全文
334 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhf 2010-06-14
  • 打赏
  • 举报
回复
对于端口扫描,除非是多核cpu,单cpu搞多线程是影响效率。。最简单的一种扫描就是尝试连接是否成功
oyhack 2010-06-13
  • 打赏
  • 举报
回复
用全局变量控制循环不就行了
wangli820 2010-06-11
  • 打赏
  • 举报
回复
线程创建了不要关闭,扫描完一个IP自动切换到另一个。线程池的本质目的就是为了避免线程创建与销毁带来的巨大开销
wolffan3150 2010-06-11
  • 打赏
  • 举报
回复
#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();
}
shaolong_2009 2010-06-11
  • 打赏
  • 举报
回复
学习!
mixdd 2010-06-11
  • 打赏
  • 举报
回复
有谁提供个线程池的例子么 谢谢
mixdd 2010-06-10
  • 打赏
  • 举报
回复
有用线程池的例子么
mayudong1 2010-06-10
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/viewcode.asp?id=2046
soswaidao 2010-06-10
  • 打赏
  • 举报
回复
网上多的是

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧