您好,登錄后才能下訂單哦!
第一、原理
端口掃描的原理很簡單,就是建立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>
以上這篇c++ 端口掃描程序實現案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。