ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

VC++多线程tcp connect扫描

2021-04-25 17:02:35  阅读:205  来源: 互联网

标签:long addr tcp connect printf sockfd threadnum 多线程 port


 

 

#include

char *host;
int threadnum,maxthread,totalport;
long nowport;


TIMEVAL timeout;
FD_SET    mask;
void usage(char *name)
{
printf("/t===================Portscaner======================/n");
printf("/t============gxisone@hotmail.com     2004/7/6=======/n");
printf("/tusage: %s IP StartPort-EndPort MaxThread(1000)/n",name);
printf("/tExample: %s 192.168.1.1 1-10000 500/n",name);
}


void display(void)  // 定义状态提示函数
{
 static int play=0;
// 进度条
char *plays[12]=
{
 " | ",
 " / ",
 " - ",
 " // ",
 " | ",
 " / ",
 " - ",
 " // ",
 " | ",
 " / ",
 " - ",
 " // ",
};

printf("=%s=/t%d threads %d %s Completed. /r", plays[play],threadnum,nowport*100/(totalport+1),"%");
play=(play==11)?0:play+1;
Sleep(1);

}

 


 void WaitThreadEnd(void)
 {
 Sleep(1000);
 printf("/nThread ending..../n");
 while(threadnum>0)
 {
  Sleep(1);
  printf(" =|=/t%d threads /r",threadnum);
 
 
 }

 printf("/nThread ended!/n");
 }

DWORD WINAPI ThreadFunc( LPVOID lp ) //线程函数,跟普通的函数没什么两样
{  

 int port=*(DWORD*)lp;

    SOCKET sockfd;
    struct sockaddr_in addr;
   
   
    u_long value;
    addr.sin_family =AF_INET;
 addr.sin_addr.s_addr =inet_addr(host);
 
  value=1;
   
   

 sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd==INVALID_SOCKET)
    {  
  printf("Socket error!/n");
  InterlockedExchangeAdd((long *)&threadnum,-1);
        return 0;
    }
    ioctlsocket(sockfd,FIONBIO,&value);
 addr.sin_port = htons(port);
  
 
    connect(sockfd,(struct sockaddr *) &addr, sizeof(addr));
 
   
    FD_ZERO(&mask);
    FD_SET(sockfd,&mask);
    value=select(0,NULL,&mask,NULL,&timeout);
    if(value==0 || value==-1)
    {   
  closesocket(sockfd);
  Sleep(50);
      InterlockedExchangeAdd((long *)&threadnum,-1);
   return 0;
      
    }
    else
 {
  shutdown(sockfd, 0);
  printf("/t/tFound port %d open./r/n",port);
  closesocket(sockfd);
  Sleep(50);
    InterlockedExchangeAdd((long *)&threadnum,-1);
 }
   
    
   
 return 0;
}
 
VOID main( int argc,char **argv )
{
 
WSADATA ws;
char *p;
int startport,endport;
clock_t start,end;//程序运行的起始和结束时间
float costtime;//程序耗时

 

if(argc!=4)
{
usage(argv[0]);
return ;
}

   

 long lresult;

 lresult=WSAStartup(MAKEWORD(2,2), &ws);

p=argv[2];//处理端口参数
    if(strstr(argv[2],"-"))
    {    startport=atoi(argv[2]);
        for(;*p;)
            if(*(p++)=='-')break;
        endport=atoi(p);
       
        if(startport

timeout.tv_usec=0;
if(maxthread>500)timeout.tv_sec=2;
else timeout.tv_sec=1;

     start=clock();//开始计时

  totalport=endport-startport;
  
 for(int port=startport;port<endport;port++,nowport++,threadnum++)
 {
     display();
  while(threadnum>maxthread)
{
 Sleep(10);
}
  CreateThread( NULL,0,ThreadFunc,&port, 0,NULL);
 }

end=clock();//计时结束
costtime= (float)(end - start) / CLOCKS_PER_SEC;  //转换时间格式
printf("Cost time:%f Sec",costtime);//显示耗时
printf("/n/n");
WaitThreadEnd();
  

WSACleanup();
return ;
}

 

 


标签:long,addr,tcp,connect,printf,sockfd,threadnum,多线程,port
来源: https://blog.51cto.com/u_9634496/2732112

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有