c++ 端口掃描程序?qū)崿F(xiàn)案例
第一、原理
端口掃描的原理很簡(jiǎn)單,就是建立socket通信,切換不通端口,通過(guò)connect函數(shù),如果成功則代表端口開(kāi)發(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ù)來(lái)裝入并初始化動(dòng)態(tài)連接庫(kù) 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); //輸出掃描過(guò)程中耗費(fèi)的時(shí)間 WSACleanup(); //釋放動(dòng)態(tài)連接庫(kù)并釋放被創(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)案例就是小編分享給大家的全部?jī)?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)聽(tīng)多個(gè)端口
相關(guān)文章
求32位機(jī)器上unsigned int的最大值及int的最大值的解決方法
本篇文章是對(duì)求32位機(jī)器上unsigned int的最大值及int的最大值的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言中無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算
C語(yǔ)言中有符號(hào)數(shù)和無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算默認(rèn)會(huì)將有符號(hào)數(shù)看成無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算,其中算術(shù)運(yùn)算默認(rèn)返回?zé)o符號(hào)數(shù),邏輯運(yùn)算當(dāng)然是返回0或1了。下面通過(guò)一個(gè)例子給大家分享C語(yǔ)言中無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算,一起看看吧2017-09-09C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題(堆棧)
這篇文章主要介紹了C語(yǔ)言使用深度優(yōu)先搜索算法解決迷宮問(wèn)題,涉及C語(yǔ)言堆棧的使用與深度優(yōu)先算法解決迷宮問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09C++踩坑實(shí)戰(zhàn)之構(gòu)造和析構(gòu)函數(shù)
不論是構(gòu)造函數(shù),還是析構(gòu)函數(shù),都是C++、C#語(yǔ)言相對(duì)于其他語(yǔ)言而言特殊的地方,它是為了方便類中對(duì)象的初始化,這篇文章主要給大家介紹了關(guān)于C++踩坑實(shí)戰(zhàn)之構(gòu)造和析構(gòu)函數(shù)的相關(guān)資料,需要的朋友可以參考下2021-07-07C++?STL之string的模擬實(shí)現(xiàn)實(shí)例代碼
C++中有命名空間的存在,我們只需把我們的代碼封到自定義的命名空間即可,下面這篇文章主要給大家介紹了關(guān)于C++?STL之string的模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-01-01