c++ 端口掃描程序


第一、原理

端口掃描的原理很簡單,就是建立socket通信,切換不通端口,通過connect函數,如果成功則代表端口開發者,否則端口關閉。

所有需要多socket程序熟悉,本內容是在window環境下的

第二、單線程實現方式

 

// PortScanf.cpp : 定義控制台應用程序的入口點。
//
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32")
int scant(char *Ip, int StartPort, int EndPort)
{	
	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
	server.sin_addr.s_addr = inet_addr(Ip); //指定被掃描的IP地址

	for (CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
	{
		s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
		server.sin_port = htons(CurrPort); //指定被掃描IP地址的端口號
		ret = connect(s, (struct sockaddr *)&server, sizeof(server)); //連接

		if (0 == ret) //判斷連接是否成功
		{
			printf("%s:%d Success O(∩_∩)O~~\n", Ip, CurrPort);
			closesocket(s);
		}
		else {
			printf("%s:%d Failed\n", Ip, CurrPort);
		}
	}	
	printf("Cost time:%f second\n", CostTime); //輸出掃描過程中耗費的時間
	WSACleanup();    //釋放動態連接庫並釋放被創建的套接字
	return 1;
}

int main()
{
	scant("127.0.0.1", 75, 100);
	
    return 0;
}

  

 

第三、多線程實現方式

由於單線程執行速度有些慢,我們加入多線程運行,

typedef struct _tagValue
{
	int start;
	int end;
}PortNums;

void _cdecl beginThreadFunc1(LPVOID lpParam) {
	PortNums *pnInt = (PortNums*)lpParam;
	scan("127.0.0.1", pnInt->start, pnInt->end);
}

int a()
{
	PortNums m1;
	m1.start = 70;
	m1.end = 500;

	PortNums m2;
	m2.start = 501;
	m2.end = 1000;

	_beginthread(beginThreadFunc1, 0, &m1);
	_beginthread(beginThreadFunc1, 0, &m2);


	getchar();
	return 0;
}

  注意需要#include<process.h>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM