c++ 端口掃描程序?qū)崿F(xiàn)案例
第一、原理
端口掃描的原理很簡(jiǎn)單,就是建立socket通信,切換不通端口,通過connect函數(shù),如果成功則代表端口開發(fā)者,否則端口關(guān)閉。
所有需要多socket程序熟悉,本內(nèi)容是在window環(huán)境下的
第二、單線程實(shí)現(xiàn)方式
// PortScanf.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#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; //當(dāng)前端口
int ret;
WSAStartup(MAKEWORD(2, 2), &wsa); //使用winsock函數(shù)之前,必須用WSAStartup函數(shù)來裝入并初始化動(dòng)態(tài)連接庫
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地址的端口號(hào)
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); //輸出掃描過程中耗費(fèi)的時(shí)間
WSACleanup(); //釋放動(dòng)態(tài)連接庫并釋放被創(chuàng)建的套接字
return 1;
}
int main()
{
scant("127.0.0.1", 75, 100);
return 0;
}

第三、多線程實(shí)現(xiàn)方式
由于單線程執(zhí)行速度有些慢,我們加入多線程運(yùn)行,
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>

以上這篇c++ 端口掃描程序?qū)崿F(xiàn)案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- c++11 多線程編程——如何實(shí)現(xiàn)線程安全隊(duì)列
- c++11多線程編程之std::async的介紹與實(shí)例
- C++11中多線程編程-std::async的深入講解
- C++11 簡(jiǎn)單實(shí)現(xiàn)線程池的方法
- 詳解C++11 線程休眠函數(shù)
- c++11新特性多線程操作實(shí)戰(zhàn)
- C++11用兩個(gè)線程輪流打印整數(shù)的實(shí)現(xiàn)方法
- C++多線程獲取返回值方法詳解
- c++11&14-多線程要點(diǎn)匯總
- 基于C++11的threadpool線程池(簡(jiǎn)潔且可以帶任意多的參數(shù))
- c++ 單線程實(shí)現(xiàn)同時(shí)監(jiān)聽多個(gè)端口
相關(guān)文章
Qt+FFMPEG實(shí)現(xiàn)循環(huán)解碼詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Qt+FFMPEG實(shí)現(xiàn)循環(huán)解碼功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下2022-08-08
C++?二叉樹的實(shí)現(xiàn)超詳細(xì)解析
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-03-03
C語言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
C++17使用折疊表達(dá)式實(shí)現(xiàn)一個(gè)IsAllTrue函數(shù)的過程
本文介紹了利用C++17特性實(shí)現(xiàn)IsAllTrue函數(shù)的方法,詳細(xì)講解了從基于初始化列表的初級(jí)版本到使用折疊表達(dá)式和類型萃取的高級(jí)優(yōu)化版本,需要的朋友參考下吧2024-09-09
C語言浮點(diǎn)函數(shù)中的modf和fmod詳解
這篇文章主要為大家詳細(xì)介紹了C語言浮點(diǎn)函數(shù)中的modf和fmod,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析
這篇文章主要介紹了C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析,迭代器模式注重對(duì)集合中元素的遍歷而不使其暴露,需要的朋友可以參考下2016-03-03

