标题:
TCP端口扫描C++源程序
[打印本页]
作者:
激情1995
时间:
2017-6-7 22:13
标题:
TCP端口扫描C++源程序
目的:扫描目的的主机端口,来探测看目的主机各个端口的情况。
0.png
(46.44 KB, 下载次数: 81)
下载附件
2017-6-8 01:57 上传
c++源程序如下:
#include <string.h>
#include <WinSock.h>
#include <iostream>
#include<string>
using namespace std;
/*
// SCAN.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#ifndef _INIT_SCOK
#define _INIT_SCOK
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib,"WS2_32")
#include <Mswsock.h>
#pragma comment(lib,"mswsock")
#include <Ws2tcpip.h>
#include <MSTcpIP.h>
#endif
typedef struct tagParam
{
DWORD dwDesIp;
USHORT nDesPort;
static LONG nThread;
}ScanParam,*pScanParam;
LONG ScanParam::nThread = 0;
DWORD WINAPI ScanPort(LPVOID lpParam);
int main(int argc, char* argv[])
{
DWORD dwAddr = 0;
LONG nStart = 0,nEnd = 0,nThread = 0;
char buf[MAX_BUF_LEN];
WSADATA wsaData;
BYTE minorVer = 2;
BYTE majorVer = 2;
WORD sockVersion = MAKEWORD(majorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
}
do
{
printf("请输入需要扫描的IP地址:");
gets(buf);
}
while((strcmp(buf,"") == 0));
dwAddr = ::inet_addr(buf);
do
{
printf("请输入扫描的起始端口:");
scanf("%d",&nStart);
}
while (nStart < 0);
do
{
printf("请输入扫描的结束端口:");
scanf("%d",&nEnd);
}
while (nStart > nEnd);
do
{
printf("请输入扫描的最大线程数:");
scanf("%d",&nThread);
}
while (nThread < 0);
printf("正在扫描中......\r\n");
for (USHORT nPort = (USHORT)nStart;nPort != (USHORT)nEnd;++nPort)
{
pScanParam pData = new ScanParam();
pData->dwDesIp = dwAddr;
pData->nDesPort = nPort;
if (CreateThread(NULL, 0, ScanPort, (LPVOID)pData, 0, NULL) != NULL)
{
::Sleep(10);
}
while(ScanParam::nThread >= nThread)
{
::Sleep(10);
}
}
while(ScanParam::nThread > 0)
{
::Sleep(10);
}
printf("扫描完成!\r\n");
system("pause");
::WSACleanup();
return 0;
}
DWORD WINAPI ScanPort(LPVOID lpParam)
{
pScanParam pData = (pScanParam)lpParam;
if(pData == NULL)
return -1;
ScanParam::nThread++;
// 创建套节字
SOCKET s = NULL;
// 填写远程地址信息
sockaddr_in remote;
remote.sin_family = AF_INET;
remote.sin_addr.S_un.S_addr = pData->dwDesIp;
remote.sin_port = ::htons(pData->nDesPort);
if((s = ::socket(AF_INET,SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
{
printf("Failed socket() %d \n", ::WSAGetLastError());
return -1;
}
printf("%s端口[%d]是否打开 \n",inet_ntoa(remote.sin_addr),::ntohs(remote.sin_port));
if(::connect(s,(SOCKADDR*)&remote,sizeof(SOCKADDR))!= SOCKET_ERROR)
{
printf("%s端口[%d]已打开\r\n",inet_ntoa(remote.sin_addr),::ntohs(remote.sin_port));
}
::closesocket(s);
ScanParam::nThread--;
DEL_P(pData);
return 1;
}
*/
#pragma comment(lib,"ws2_32.lib")
int main()
{
//初始化Windows Sockets 动态库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
cout << "失败:WSAStartup" << endl;
return 1;
}
//连接服务器
char IP[100];
int star_host, end_host;
cout << "请输入目标主机+开始端口+终止端口 " << endl;
cin >> IP >> star_host >> end_host;
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_addr.S_un.S_addr = inet_addr(IP);
if (star_host > end_host)
{
cout << "终止端口应该大于等于起始端口" << endl;
return 0;
}
for (int now_host = star_host; now_host <= end_host; now_host++)
{
addrServ.sin_port = htons(now_host);
//创建套接字
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
cout << "失败:创建socket!" << endl;
return 1;
}
if (connect(sClient, (sockaddr *)&addrServ, sizeof(sockaddr)) == SOCKET_ERROR)
{
cout << "关闭:" << now_host << endl;
}
else
cout << "开放:" << now_host << endl;
closesocket(sClient);
}
//关闭套接字,释放资源
//closesocket(sClient);
WSACleanup();
return 0;
}
复制代码
所有资料51hei提供下载:
扫描目的主机端口.zip
(4.76 KB, 下载次数: 14)
2017-6-7 22:12 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1