#include <stdio.h>
#include<winsock2.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
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<1 || endport>65535)
{
printf("Port Error!\n");
return;
}
}
host=argv[1];
maxthread=(atoi(argv[3])-1>999)?999:atoi(argv[3])-1;
usage(argv[0]);
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 ;
}
分享到:
相关推荐
vc++ 2010写tcp connect多线程扫描器,小东西 适合初学者
简单的一个聊天室基于多线程,TCP编写。
单线程利用tcp connect原理扫描开放端口
VC++多线程编程中文版,很用的一本电子书多线程综合技术篇多线程编程
多线程TCP端口扫描器源码,win32程序。
多大10来个的VC++多线程编程实例!希望对大家有所帮助!
vc++多线程端口扫描源程序
vc++ 多线程 网络编程 关于tcp ip协议 的。实现数据的发送接收,关于socket的使用。
10个VC++多线程操作实例源代码.RAR
VC++ 多线程与聊天室程序的创建 VC++ 多线程与聊天室程序的编写,多线程应用中容易出现的问题。互斥对象的讲解,如何采用互斥对象来实现多线程的同步。如何利用命名互斥对象保证应用程序只有一个实例运行。应用多...
VC++多线程下内存操作的优化
VC++多线程与网络
VC实现多线程操作,创建多个子线程,子线程1:显示时间,子线程2:显示进度条,子线程3:绘图。
Delphi编写的多线程端口扫描工具及Delphi源代码 Ver 2018-08 可对IP范围进行排除及追加,最高999线程。
vc++编的多线程扫描端口
基于VC++的多线程管理程序,测试程序中一共有两个进程,可以演示让两个进程同进工作,同进关闭,也可以一个一个工作,分开进行
讲述windows多线程编程的机制,包括线程同步、线程通讯等,每一个讲解附带源码
包含了多线程基本内容的讲解以及代码实现,多线程同步的四种方法(临界区、互斥、事件、信号量)的实现。
VC++多线程编程实例集,对多线程编程初学者很有用处。文件里的实例已经编译运行通过。