#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;
}
基于TCP协议的端口扫描设计(C++初学)
最新推荐文章于 2021-03-15 19:48:18 发布