首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

多執行緒非阻塞 TCP 連接掃描器設計與效能調優

     編輯:關於VC++

掃描原理:TCP Connect() 掃描

呼叫 connect() 嘗試建立完整三向交握:

  • 成功 → 埠開放(服務正在監聽)
  • 失敗/超時 → 埠關閉或被過濾

優點:無需原始套接字權限,普通使用者即可執行。缺點:日誌明顯,易被 IDS 捕獲。

架構設計:生產者-消費者 + 執行緒池

主執行緒 (UI)
    │
    ▼
StartScan 執行緒 (生產者)
    ├─ 依範圍/指定埠建立 DoScanPort 執行緒
    ├─ 控制並發上限 (g_nMaxThread = 200)
    └─ 等待所有掃描執行緒結束
    │
    ▼
DoScanPort 執行緒 (消費者, 每埠一個)
    ├─ socket() + ioctlsocket(FIONBIO) 非阻塞
    ├─ connect() 發起
    ├─ select() 監聽寫就緒,超時 g_dwTimeOut (預設 1000ms)
    ├─ 發送 WM_COPYDATA 回主視窗更新結果
    └─ 原子遞減 g_nThreadCount

關鍵程式碼片段

非阻塞連線與 select 超時控制

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
u_long flag = 1; ioctlsocket(sock, FIONBIO, &flag); // 非阻塞

sockaddr_in sa = {AF_INET, htons(port), inet_addr(targetIP)};
connect(sock, (sockaddr*)&sa, sizeof(sa)); // 立即返回

fd_set wset; FD_ZERO(&wset); FD_SET(sock, &wset);
timeval tv = {timeout/1000, timeout%1000};
int ret = select(0, NULL, &wset, NULL, &tv);

if (ret == 1 && FD_ISSET(sock, &wset)) {
    int err = 0; int len = sizeof(err);
    getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*)&err, &len);
    if (err == 0) // 連線成功
        SendMessage(hWnd, ..., PORT_OPEN, port);
}
closesocket(sock);

執行緒計數同步


// StartScan 中
while (g_nThreadCount >= g_nMaxThread) Sleep(10);
if (CreateThread(..., &tid)) InterlockedIncrement(&g_nThreadCount);

// DoScanPort 結束
InterlockedDecrement(&g_nThreadCount);

效能基準與調優建議

參數測試值建議
最大執行緒200過高導致調度開銷反而降速;依 CPU 核心與網路帶寬調整
超時時間1000ms區網 200-500ms;跨公網 1000-3000ms。過短誤判率升高
掃描速度~150 ports/sec受限於 TCP 交握 RTT 與 select 精度

已知問題與改進方向

  1. 本機 127.0.0.1 vs 實際 IP 差異:回環介面未綁定某些服務(如 NetBIOS 139),建議掃描介面 IP 而非回環
  2. 單主機限制:擴充為 CIDR 範圍掃描,引入非同步 I/O (IOCP) 提升量級
  3. 無服務識別:整合 Banner Grabbing 或指紋庫
  4. 防火牆適應:增加 SYN 半開放掃描模式(需原始套接字/WinPcap)

法律與道德提醒

未經授權掃描他人主機屬違法行為。本程式僅供教學、授權滲透測試與自有資產盤點使用。

結語

多執行緒非阻塞模型在簡單易懂與效能之間取得平衡。理解 select 邊緣觸發行為、執行緒池背壓控制、超時與準確率的權衡,是編寫高品質掃描器的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved