程序适应环境与基本介绍

  • 情况:开2000个线程,扫描主机上开启的端口,扫描时间40秒左右。
  • 瓶颈:不管开5000还是更多,都不能大幅加快扫描时间。
  • 瓶颈解决方法:可以使用最常被开放的1000个端口列表进行扫描,网上应该有,社会学+编程。
  • 注意:socket是宝贵的系统资源,不用要关闭;多线程中临界区资源要加锁。
  • 编程环境:vs2008(c98)
  • 代码如下:
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <Winsock2.h>
  4. #pragma comment(lib,"Ws2_32")//socket要用到的系统库
  5. //目标地址
  6. #define IP "127.0.0.1"
  7. //线程个数
  8. #define THREADCOUNT 2000
  9. DWORD WINAPI ThreadProc( LPVOID lpParameter);
  10. //端口号
  11. int PortNum=0;
  12. //临界区变量
  13. CRITICAL_SECTION cs;
  14. //线程函数
  15. DWORD WINAPI ThreadProc( LPVOID lpParameter)
  16. {
  17. //创建套接字
  18. SOCKET TryConnect;
  19. while (1)
  20. {
  21. if (PortNum>65535)
  22. {
  23. break;
  24. }
  25. //进入临界区
  26. EnterCriticalSection(&cs);
  27. int tmpport = PortNum;
  28. PortNum++;
  29. //DWORD threadID=GetCurrentThreadId();
  30. //printf("线程%d正在检测端口%d\n",threadID,PortNum);//所有使用临界区资源的代码都要加锁
  31. //离开临界区
  32. LeaveCriticalSection(&cs);
  33. TryConnect = socket(AF_INET,SOCK_STREAM,0);
  34. if (INVALID_SOCKET == TryConnect)
  35. {
  36. printf("Invalid socket.\n");
  37. }
  38. //尝试连接
  39. sockaddr_in addrMe = {0};
  40. addrMe.sin_family=AF_INET;
  41. addrMe.sin_port = htons(tmpport);
  42. addrMe.sin_addr.S_un.S_addr = inet_addr(IP);
  43. int retCon = connect(TryConnect,(sockaddr*)&addrMe,sizeof(sockaddr_in));
  44. if (SOCKET_ERROR != retCon)
  45. {
  46. printf("检测到目标主机开放%d端口\n",tmpport);
  47. }
  48. closesocket(TryConnect);//防止开启太多socket连接,导致后面socket分配无效
  49. }
  50. return 0;
  51. }
  52. int main(int argc, char* argv[])
  53. {
  54. //初始化套接字
  55. WSADATA ws;
  56. ::WSAStartup(MAKEWORD(2,0),&ws);
  57. DWORD start = GetTickCount();
  58. //初始化临界区
  59. InitializeCriticalSection(&cs);
  60. //多线程扫描
  61. HANDLE hThread[THREADCOUNT];
  62. for (int i=0;i<THREADCOUNT;i++)
  63. {
  64. hThread[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,(LPVOID)0,0,NULL);
  65. }
  66. //当thread数量超过64的处理
  67. int tempNumThreads = THREADCOUNT;
  68. int tempMax = 0;
  69. while( tempNumThreads >= MAXIMUM_WAIT_OBJECTS )
  70. {
  71. tempNumThreads -= MAXIMUM_WAIT_OBJECTS;
  72. WaitForMultipleObjects( MAXIMUM_WAIT_OBJECTS, &hThread[ tempMax ], false, INFINITE);
  73. tempMax += MAXIMUM_WAIT_OBJECTS;
  74. }
  75. WaitForMultipleObjects( tempNumThreads, &hThread[ tempMax ], false, INFINITE);
  76. //删除临界区
  77. DeleteCriticalSection(&cs);
  78. DWORD end = GetTickCount();
  79. printf("use time(s):%f\n", (end-start)/1000.0);
  80. system("pause");
  81. return 0;
  82. }

c++ 多线程(2000个)端口扫描(附源码)的更多相关文章

  1. [原创]K8Cscan插件之端口扫描C#源码

    [原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...

  2. cesium 圆圈警戒扫描(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  3. cesium 雷达扫描(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  4. 干货:Java多线程详解(内附源码)

      线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关). 在java中开启一个新线程非常简单,创建一个Thread对象,然后调用它的start方法,一个 ...

  5. HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版

    HTML5和CSS3技术是目前整个网页的基础.<HTML5与CSS3实例教程(第2版)>共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.这一版全面讲解了最新的HTML5和 ...

  6. Cesium专栏-雷达遮罩动态扫描(附源码下载)

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

  7. 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...

  8. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  9. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

    在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...

随机推荐

  1. TF-epoch、 iteration和batchsize区别(转载)

    from http://www.cnblogs.com/qggg/p/6876942.html 转自 http://blog.csdn.net/sinat_30071459/article/detai ...

  2. time时间库使用示例

    time时间库主要有以下几个方法 1. 生成struct_time ,然后就可以很方便的获取到年月日,时分秒等信息 time.localtime() 2. 生成时间戳 time.time() 3. 将 ...

  3. postman批量调用接口并发测试

    本文出自:https://www.cnblogs.com/2186009311CFF/p/11425913.html 接口测试在开发中很容易遇到,下面是请教别人学会的并发测试,希望能帮到需要用到的你, ...

  4. Codeforces 1203F1 Complete the Projects (easy version)

    cf题面 Time limit 2000 ms Memory limit 262144 kB 解题思路 看见这题觉得贪心可做,那就贪吧.(昨天真是贪心的一天,凌晨才被这两道贪心题虐,下午多校又来,感觉 ...

  5. FastDfs单机版搭建

    详细的最新版fastdfs单机版搭建 前言 目前项目是tomcat单机部署的,图片.视频也是上传到tomcat目录下,关键是此项目的主要内容还就是针对图片.视频的,这让我非常担忧:文件服务器的应用是必 ...

  6. SQL Server服务起不了

    转载 MSSQLSERVER服务无法启动的解决方案   1.IP地址配置不正确: 打开 Microsoft SQL Server 2005配置工具下的SQL Server Configuration ...

  7. Spotlight_on_windows 安装和监控

    一.下载 1.下载并安装Spotlight_on_windows 2.填写注册码 Authorization Key:295713336449229168750 Site Message:Bergel ...

  8. React用dangerouslySetInnerHTML动态渲染HTML

    React用dangerouslySetInnerHTML动态渲染HTML React项目,需要把后台返回的一段html代码在页面上显示 在render获取内容, //在render里获取内容 con ...

  9. eclipse.ini中加入-vm

    1. 在eclipse.ini中添加两行     -vm     C:\Program Files\Java\jdk1.6.0_02\bin\javaw.exe     注意: 要写在两行,写在一行不 ...

  10. 对AC自动机+DP题的一些汇总与一丝总结 (2)

    POJ 2778 DNA Sequence (1)题意 : 给出m个病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 关键字眼:不包含,个数,长度 DP[i][j] : 表示长 ...