找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5292|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

TCP端口掃描C++源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
目的:掃描目的的主機(jī)端口,來探測(cè)看目的主機(jī)各個(gè)端口的情況。


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("請(qǐng)輸入需要掃描的IP地址:");
  44. gets(buf);
  45. }
  46. while((strcmp(buf,"") == 0));

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

  54. do
  55. {
  56. printf("請(qǐng)輸入掃描的結(jié)束端口:");
  57. scanf("%d",&nEnd);
  58. }
  59. while (nStart > nEnd);

  60. do
  61. {
  62. printf("請(qǐng)輸入掃描的最大線程數(shù):");
  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. // 創(chuàng)建套節(jié)字
  97. SOCKET s = NULL;
  98. // 填寫遠(yuǎn)程地址信息
  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 動(dòng)態(tài)庫

  123.         WSADATA wsaData;
  124.         if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  125.         {
  126.                 cout << "失。篧SAStartup" << endl;
  127.                 return 1;
  128.         }
  129.        
  130.         //連接服務(wù)器
  131.          char IP[100];
  132.         int star_host, end_host;
  133.         cout << "請(qǐng)輸入目標(biāo)主機(jī)+開始端口+終止端口 " << 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 << "終止端口應(yīng)該大于等于起始端口" << 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.                 //創(chuàng)建套接字
  148.                 SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  149.                 if (sClient == INVALID_SOCKET)
  150.                 {
  151.                         cout << "失。簞(chuàng)建socket!" << endl;
  152.                         return 1;
  153.                 }
  154.                 if (connect(sClient, (sockaddr *)&addrServ, sizeof(sockaddr)) == SOCKET_ERROR)
  155.                 {
  156.                         cout << "關(guān)閉:" << now_host << endl;
  157.                 }
  158.                 else
  159.                         cout << "開放:" << now_host << endl;

  160.                 closesocket(sClient);
  161.         }

  162.         //關(guān)閉套接字,釋放資源
  163.         //closesocket(sClient);
  164.         WSACleanup();

  165.         return 0;
  166. }
復(fù)制代碼

所有資料51hei提供下載:
掃描目的主機(jī)端口.zip (4.76 KB, 下載次數(shù): 14)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表