日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

简单的端口扫描器(TCP connect)

發布時間:2023/12/13 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 简单的端口扫描器(TCP connect) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

端口掃描器原理相對簡單,采用的是TCP connect狀態判斷。具體來說:TCP connect方式使用系統網絡API connect向目標主機的端口發起連接,如果無法連接,說明該端口關閉。該方式掃描速度比較慢,而且由于建立完整的TCP連接會在目標機上留下記錄信息,不夠隱蔽。所以,TCP connect是TCP SYN無法使用才考慮選擇的方式。

在編寫過程中,采用多線程時遇到共享變量訪問的同步問題,經過試驗,這里僅僅簡單采用Sleep()函數進行等待就能擁有不錯的效果。

代碼及部分說明如下:

#include <stdio.h>

#include <WinSock2.h>

#include <time.h>

#pragma comment(lib,"ws2_32.lib")

int gNumThread = 0;

void usage()

{

printf("Usage: <TCPScanner> [IP]
[StartPort]-[EndPort]
");

printf("Example: TCPScanner 192.168.1.1 80-100
");

ExitProcess(1);

}

DWORD WINAPI ThreadProc(LPVOID pPara);

int main(int argc, char *argv[])

{

WSADATA wsad;

SOCKADDR_IN target;

char *IP,*p;

USHORT
PortEnd,PortStart,i;

clock_t TimeStart,TimeEnd;

HANDLE hThread;

DWORD dwThreadId;

//參數處理

if(argc!=3) usage();

IP = argv[1]; //第一個參數是IP

PortStart = atoi(argv[2]); //第二個參數是端口范圍,分別得到首尾端口

for(p = argv[2];*(p++)!='-';); //指向結束端口的起始位置

PortEnd =
atoi(p);

printf("Scanner will work on %s %d-%d now..
",IP,PortStart,PortEnd);

TimeStart =
clock();

//加載,創建套接字,填寫目標主機地址,按端口掃描

WSAStartup(MAKEWORD(2,2),&wsad);

target.sin_family
= AF_INET;

target.sin_addr.s_addr = inet_addr(IP);

for(i=PortStart;i<=PortEnd;++i){

target.sin_port
= htons(i);

//創建進程接收數據

hThread =
CreateThread(NULL,0,ThreadProc,(LPVOID)&target,0,&dwThreadId);

Sleep(10); //主進程先等待一段時間,使得子進程能夠有時間來讀取端口信息,不致跳過、錯開某些端口

if (hThread == NULL){

printf("CreateThread() failed: %d
", GetLastError());

break;

}

CloseHandle(hThread);
//不再需要這個句柄,關掉它,但并非是關掉對應線程

}

Sleep(50); //等待上一段時間,等待所有子進程結束任務

TimeEnd =
clock();

printf("Time cost:%.3fs
",(float)(TimeEnd-TimeStart)/CLOCKS_PER_SEC);

WSACleanup();

return 0;

}

DWORD WINAPI ThreadProc(LPVOID pParam)

{

SOCKADDR_IN target = *(SOCKADDR_IN*) pParam;

SOCKET sConn;

printf("%s %d
",inet_ntoa(target.sin_addr),ntohs(target.sin_port));

sConn = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

if(connect(sConn,(const SOCKADDR*) &target,sizeof(target)) == SOCKET_ERROR) return 0;

printf("Port %d is open
",ntohs(target.sin_port));

closesocket(sConn);

return 0;

}

總結

以上是生活随笔為你收集整理的简单的端口扫描器(TCP connect)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。