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)
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--;