找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4571|回复: 0
收起左侧

TCP端口扫描C++源程序

[复制链接]
ID:208997 发表于 2017-6-7 22:13 | 显示全部楼层 |阅读模式
目的:扫描目的的主机端口,来探测看目的主机各个端口的情况。
0.png

c++源程序如下:
  1. #include <string.h>
  2. #include <WinSock.h>
  3. #include <iostream>
  4. #include<string>
  5. using namespace std;
  6. /*
  7. // SCAN.cpp : Defines the entry point for the console application.
  8. //

  9. #include "stdafx.h"
  10. #ifndef _INIT_SCOK
  11. #define _INIT_SCOK

  12. #include <stdlib.h>
  13. #include <winsock2.h>
  14. #pragma comment(lib,"WS2_32")
  15. #include <Mswsock.h>
  16. #pragma comment(lib,"mswsock")
  17. #include <Ws2tcpip.h>
  18. #include <MSTcpIP.h>
  19. #endif
  20. typedef struct tagParam
  21. {
  22. DWORD  dwDesIp;
  23. USHORT nDesPort;
  24. static LONG nThread;
  25. }ScanParam,*pScanParam;

  26. LONG ScanParam::nThread = 0;


  27. DWORD WINAPI ScanPort(LPVOID lpParam);



  28. int main(int argc, char* argv[])
  29. {
  30. DWORD dwAddr = 0;
  31. LONG  nStart = 0,nEnd = 0,nThread = 0;

  32. char buf[MAX_BUF_LEN];
  33. WSADATA wsaData;
  34. BYTE minorVer = 2;
  35. BYTE majorVer = 2;
  36. WORD sockVersion = MAKEWORD(majorVer,majorVer);
  37. if(::WSAStartup(sockVersion,&wsaData)!=0)
  38. {
  39. exit(0);
  40. }
  41. do
  42. {
  43. printf("请输入需要扫描的IP地址:");
  44. gets(buf);
  45. }
  46. while((strcmp(buf,"") == 0));

  47. dwAddr = ::inet_addr(buf);
  48. do
  49. {
  50. printf("请输入扫描的起始端口:");
  51. scanf("%d",&nStart);
  52. }
  53. while (nStart < 0);

  54. do
  55. {
  56. printf("请输入扫描的结束端口:");
  57. scanf("%d",&nEnd);
  58. }
  59. while (nStart > nEnd);

  60. do
  61. {
  62. printf("请输入扫描的最大线程数:");
  63. scanf("%d",&nThread);
  64. }
  65. while (nThread < 0);


  66. printf("正在扫描中......\r\n");
  67. for (USHORT nPort = (USHORT)nStart;nPort != (USHORT)nEnd;++nPort)
  68. {
  69. pScanParam pData = new ScanParam();
  70. pData->dwDesIp = dwAddr;
  71. pData->nDesPort = nPort;
  72. if (CreateThread(NULL, 0, ScanPort, (LPVOID)pData, 0, NULL) != NULL)
  73. {
  74. ::Sleep(10);
  75. }
  76. while(ScanParam::nThread >= nThread)
  77. {
  78. ::Sleep(10);
  79. }
  80. }
  81. while(ScanParam::nThread > 0)
  82. {
  83. ::Sleep(10);
  84. }
  85. printf("扫描完成!\r\n");
  86. system("pause");
  87. ::WSACleanup();
  88. return 0;
  89. }


  90. DWORD WINAPI ScanPort(LPVOID lpParam)
  91. {
  92. pScanParam pData = (pScanParam)lpParam;
  93. if(pData == NULL)
  94. return -1;

  95. ScanParam::nThread++;
  96. // 创建套节字
  97. SOCKET s = NULL;
  98. // 填写远程地址信息
  99. sockaddr_in remote;
  100. remote.sin_family = AF_INET;
  101. remote.sin_addr.S_un.S_addr = pData->dwDesIp;
  102. remote.sin_port = ::htons(pData->nDesPort);

  103. if((s = ::socket(AF_INET,SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
  104. {
  105. printf("Failed socket() %d \n", ::WSAGetLastError());
  106. return -1;
  107. }
  108. printf("%s端口[%d]是否打开 \n",inet_ntoa(remote.sin_addr),::ntohs(remote.sin_port));
  109. if(::connect(s,(SOCKADDR*)&remote,sizeof(SOCKADDR))!= SOCKET_ERROR)
  110. {
  111. printf("%s端口[%d]已打开\r\n",inet_ntoa(remote.sin_addr),::ntohs(remote.sin_port));
  112. }
  113. ::closesocket(s);

  114. ScanParam::nThread--;

  115. DEL_P(pData);
  116. return 1;
  117. }

  118. */
  119. #pragma comment(lib,"ws2_32.lib")
  120. int main()
  121. {
  122.         //初始化Windows Sockets 动态库

  123.         WSADATA wsaData;
  124.         if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  125.         {
  126.                 cout << "失败:WSAStartup" << endl;
  127.                 return 1;
  128.         }
  129.        
  130.         //连接服务器
  131.          char IP[100];
  132.         int star_host, end_host;
  133.         cout << "请输入目标主机+开始端口+终止端口 " << endl;
  134.         cin >> IP >> star_host >> end_host;
  135.          
  136.         SOCKADDR_IN addrServ;
  137.         addrServ.sin_family = AF_INET;
  138.         addrServ.sin_addr.S_un.S_addr = inet_addr(IP);
  139.         if (star_host > end_host)
  140.         {
  141.                 cout << "终止端口应该大于等于起始端口" << endl;
  142.                 return 0;
  143.         }

  144.         for (int now_host = star_host; now_host <= end_host; now_host++)
  145.         {
  146.                 addrServ.sin_port = htons(now_host);

  147.                 //创建套接字
  148.                 SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  149.                 if (sClient == INVALID_SOCKET)
  150.                 {
  151.                         cout << "失败:创建socket!" << endl;
  152.                         return 1;
  153.                 }
  154.                 if (connect(sClient, (sockaddr *)&addrServ, sizeof(sockaddr)) == SOCKET_ERROR)
  155.                 {
  156.                         cout << "关闭:" << now_host << endl;
  157.                 }
  158.                 else
  159.                         cout << "开放:" << now_host << endl;

  160.                 closesocket(sClient);
  161.         }

  162.         //关闭套接字,释放资源
  163.         //closesocket(sClient);
  164.         WSACleanup();

  165.         return 0;
  166. }
复制代码

所有资料51hei提供下载:
扫描目的主机端口.zip (4.76 KB, 下载次数: 14)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表