多线程端口扫描器
来源:互联网 发布:花呗可以淘宝买东西吗 编辑:程序博客网 时间:2024/04/30 04:38
废话不多说,直接上源码。需要在cmd下传递参数
#include <stdio.h>#include<winsock2.h>#include <time.h>#pragma comment(lib,"ws2_32.lib")char *host;int thread_num,thread_max,port_num;long port_now;TIMEVAL timeout; FD_SET mask;void introduc(char *name);void display(void) ;void ThreadEnd(void);DWORD WINAPI ThreadScan( LPVOID lp ); void main( int argc,char **argv ) { WSADATA ws; char *p; int port_start,port_end; if(argc!=4) //判断参数是否为4个 { introduc(argv[0]); return ; } long result; result=WSAStartup(MAKEWORD(2,2), &ws); p=argv[2];//取得端口的范围 if(strstr(argv[2],"-")) { port_start=atoi(argv[2]); for(;*p;) if(*(p++)=='-')break; port_end=atoi(p); if(port_start<1 || port_end>65535) { printf("Port Error!\n"); return; } } host=argv[1]; thread_max=(atoi(argv[3])-1>999)?999:atoi(argv[3])-1; introduc(argv[0]); timeout.tv_usec=0; if(thread_max>500)timeout.tv_sec=2; else timeout.tv_sec=1; port_num=port_end-port_start; printf("Loading......\n"); for(int port=port_start;port<port_end;port++,port_now++,thread_num++) { display(); while(thread_num>thread_max)Sleep(10);//当线程数大于最大线程数就等待一会 CreateThread( NULL,0,ThreadScan,&port, 0,NULL);//创建扫描线程 } printf("\n\n"); ThreadEnd(); WSACleanup(); return ;}//介绍函数void introduc(char *name) { printf("---------------------------------Portscaner---------------------------------\n"); printf("\tplease input : %s,IP,port from start to end,thread_max(1000)\n",name); printf("\tExample: %s 192.168.1.1 1-10000 500\n",name); printf("---------------------------------Portscaner---------------------------------\n");}// 定义状态提示函数 void display(void) { printf("%dthreads %d %s completed.\r",thread_num,port_now*100/(port_num+1),"%"); Sleep(1);} //关闭线程void ThreadEnd(void){ Sleep(1000); printf("\nThread ending....\n"); while(thread_num>0) { Sleep(1); printf(" \t%d threads \r",thread_num); } printf("\nThread ended!\n");}//扫描函数 DWORD WINAPI ThreadScan( LPVOID lp ){ int port=*(DWORD*)lp; //取得要扫描的端口号 SOCKET sock; struct sockaddr_in addr; u_long value; addr.sin_family =AF_INET; addr.sin_addr.s_addr =inet_addr(host); value=1; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock==INVALID_SOCKET) { printf("Socket error!\n"); InterlockedExchangeAdd((long *)&thread_num,-1);//线程数减1 return 0; } ioctlsocket(sock,FIONBIO,&value);//把sock设定为非阻塞模式 addr.sin_port = htons(port); connect(sock,(struct sockaddr *) &addr, sizeof(addr)); FD_ZERO(&mask); FD_SET(sock,&mask); value=select(0,NULL,&mask,NULL,&timeout); if(value==0 || value==-1) { closesocket(sock); Sleep(50); InterlockedExchangeAdd((long *)&thread_num,-1); return 0; } else { shutdown(sock, 0); //阻止socket接收和发送数据 printf("\t\tFound port %d open.\r\n",port);//打印扫到的端口 closesocket(sock); Sleep(50); InterlockedExchangeAdd((long *)&thread_num,-1); } return 0;}
0 0
- 多线程端口扫描器
- 多线程端口扫描器
- python多线程端口扫描器
- [Ruby乐趣]多线程端口扫描器
- perl写端口多线程扫描器
- python 多线程单端口扫描器
- linux多线程端口扫描器原理与实现
- 再议perl写多线程端口扫描器
- BCB打造多线程端口的扫描器(zhuan)
- Java编写的多线程端口扫描器
- 多线程端口扫描器的实现(java)
- Java多线程编写高效端口扫描器
- 端口扫描器
- 端口扫描器
- 端口扫描器
- 端口扫描器
- C#项目实战-实现一个多线程端口扫描器
- Java编写的多线程本机端口扫描器
- 编写程序从1到1000000写到一个文件中
- 【Leetcode长征系列】Unique Paths II
- UVa 12412 A Typical Homework(学生信息管理系统)
- Mat 转为 IplImage
- leetcode Word Break & Word Break ||
- 多线程端口扫描器
- android右上方不显示3个点的菜单的解决方法
- C语言中sscanf 的用法
- 解密:如何构建Java开发环境(第三篇)
- Java类的大括号外面还可以加分号
- hdu 1210 Eddy's 洗牌问题
- 108_横竖屏切换
- HDU 1754——I Hate It(线段树单点修改)
- 七夕之后的C++算法学习