基于TCP协议的端口扫描设计(C++初学)

#define WIN32_LEAN_AND_MEAN	
#include<iostream>
#include<WinSock2.h>
#include<cstring>
#include<thread>	//进行多线程
#pragma comment (lib,"ws2_32.lib")	//加载ws2_32库文件

using namespace std;


//扫描函数——自己创建的线程1
void scan1(string I, int StartPort1, int EndPord1)
{
	//加载socket函数
	WSADATA wsa;
	SOCKET s;
	struct sockaddr_in server;

	int CurrPort;	//当前端口
	int ret;

	WSAStartup(MAKEWORD(2, 2), &wsa);    //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库

	server.sin_family = AF_INET;	//指定地址格式,在winsock中只能使用AF_INET
	
	const char* IP = I.data();
	server.sin_addr.s_addr = inet_addr(IP);

	for (CurrPort = StartPort1; CurrPort <= EndPord1; CurrPort++)
	{
		s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
		server.sin_port = htons(CurrPort);//指定被扫描的端口
		ret = connect(s, (struct sockaddr*) & server, sizeof(server));//进行连接

		if (ret == 0)
		{
			cout << "IP:" << IP << "\tPort: " << CurrPort << "\topen" << endl;
			closesocket(s);
		}
		else {
			cout << "IP:" << IP << "\tPort: " << CurrPort << "\tclose" << endl;
			closesocket(s);
		}
	}
	WSACleanup();	//释放动态连接库并释放被创建的套接字
}

//扫描函数——自己创建的线程2
void scan2(string I, int StartPort2, int EndPord2)
{
	//加载socket函数
	WSADATA wsa;
	SOCKET s;
	struct sockaddr_in server;

	int CurrPort;	//当前端口
	int ret;

	WSAStartup(MAKEWORD(2, 2), &wsa);    //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库

	server.sin_family = AF_INET;	//指定地址格式,在winsock中只能使用AF_INET

	const char* IP = I.data();
	server.sin_addr.s_addr = inet_addr(IP);

	for (CurrPort = StartPort2; CurrPort <= EndPord2; CurrPort++)
	{
		s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
		server.sin_port = htons(CurrPort);//指定被扫描的端口
		ret = connect(s, (struct sockaddr*) & server, sizeof(server));//进行连接

		if (ret == 0)
		{
			cout << "IP:" << IP << "\tPort: " << CurrPort << "\topen" << endl;
			closesocket(s);
		}
		else {
			cout << "IP:" << IP << "\tPort: " << CurrPort << "\tclose" << endl;
			closesocket(s);
		}
	}
	WSACleanup();	//释放动态连接库并释放被创建的套接字

}

//扫描函数——自己创建的线程3
void scan3(string I, int StartPort3, int EndPord3)
{
	//加载socket函数
	WSADATA wsa;
	SOCKET s;
	struct sockaddr_in server;

	int CurrPort;	//当前端口
	int ret;

	WSAStartup(MAKEWORD(2, 2), &wsa);    //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库

	server.sin_family = AF_INET;	//指定地址格式,在winsock中只能使用AF_INET

	const char* IP = I.data();
	server.sin_addr.s_addr = inet_addr(IP);

	for (CurrPort = StartPort3; CurrPort <= EndPord3; CurrPort++)
	{
		s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
		server.sin_port = htons(CurrPort);//指定被扫描的端口
		ret = connect(s, (struct sockaddr*) & server, sizeof(server));//进行连接

		if (ret == 0)
		{
			cout << "IP:" << IP << "\tPort: " << CurrPort << "\topen" << endl;
			closesocket(s);
		}
		else {
			cout << "IP:" << IP << "\tPort: " << CurrPort << "\tclose" << endl;
			closesocket(s);
		}
	}
	WSACleanup();	//释放动态连接库并释放被创建的套接字
}

//主函数
int main()
{
	//初始化变量
	int StartPort = 0;
	int EndPort = 0;
	int StartPort1 = 0;
	int	StartPort2 = 0;
	int	StartPort3 = 0;
	int	EndPort1 = 0;
	int EndPort2 = 0;
	int EndPort3 = 0;
	string I;

	//信息输入
	cout << "IP: ";
	cin >> I;
	cout << endl;
	cout << "起始端口号:";
	cin >> StartPort;
	cout << endl;
	cout << "截至端口号:";
	cin >> EndPort;
	cout << endl;
	cout << "扫描中......" << endl;
	
	//端口分配
	StartPort1 = StartPort;
	EndPort1 = StartPort + (EndPort - StartPort )/3;

	StartPort2 = StartPort + (EndPort - StartPort) / 3 + 1;
	EndPort2 = StartPort + (2 * (EndPort - StartPort) / 3);

	StartPort3 = StartPort + (2 * (EndPort - StartPort) / 3) + 1;
	EndPort3 = EndPort;

	//cout << "StartPort1: " << StartPort1 << endl;
	//cout << "EndPort1: "<< EndPort1 << endl;

	//cout << "StartPort2: " << StartPort2 << endl;
	//cout << "EndPort2: " << EndPort2 << endl;

	//cout << "StartPort3: " << StartPort3 << endl;
	//cout << "EndPort3: " << EndPort3 << endl;
	//
	
	//开始扫描—-创建线程并开始运行
	thread mySCAN_1(scan1,I, StartPort1, EndPort1);
	
	thread mySCAN_2(scan2,I, StartPort2, EndPort2);
	
	thread mySCAN_3(scan3,I, StartPort3, EndPort3);
	
	mySCAN_1.join();
	mySCAN_2.join();
	mySCAN_3.join();
	cout << "扫描结束!" << endl;

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值