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

Internet 服務埠連線測試工具設計與實現 (Socket 非同步/同步模式)

     編輯:VC 教學

應用場景

  • 診斷 DNS (53)、SMTP (25)、POP3 (110)、HTTP (80)、FTP (21) 等服務可用性與延遲。
  • 多鏡像站點測速,選擇最快下載源。
  • 簡易網路效能基準測試。

Socket 程式模型 (MFC CSocket / WinSock)

  1. 建立 Socket:socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) (TCP 連線導向)。
  2. 非阻塞/異步:ioctlsocket(s, FIONBIO, &on) 或 WSAAsyncSelect / WSAEventSelect / Overlapped I/O,避免 UI 凍結。
  3. 連線:connect(s, (sockaddr*)&addr, sizeof(addr))。非阻塞下立即返回 WSAEWOULDBLOCK,等待 FD_CONNECT 事件。
  4. 發送測試資料 (可選):如 HTTP HEAD / HTTP/1.0\r\n\r\n。
  5. 接收回應:recv 讀取標頭/內容,計算往返時間 (RTT)。
  6. 關閉:closesocket / shutdown。

MFC CSocket 封裝流程

// 1. 建立 CSocket 物件
CSocket sock;
sock.Create();

// 2. 非同步連線
sock.AsyncSelect(FD_CONNECT | FD_READ | FD_CLOSE);  // 視窗接收通知
sock.Connect(ip, port);  // 立即返回

// 3. 訊息處理 (OnSocketNotify)
void CTesterDlg::OnSocketNotify(WPARAM wParam, LPARAM lParam) {
    SOCKET h = (SOCKET)wParam;
    int event = WSAGETSELECTEVENT(lParam);
    int error = WSAGETSELECTERROR(lParam);
    if (error) { LogError(h, error); return; }

    switch (event) {
        case FD_CONNECT:
            // 連線成功,記錄連線時間,發送測試封包
            sock.Send(testData, len);
            break;
        case FD_READ:
            // 接收回應,記錄首包時間 → RTT
            char buf[1024];
            int n = sock.Receive(buf, sizeof(buf));
            if (n > 0) { CalcRTT(); LogSuccess(ip, port, rtt); }
            sock.Close();
            break;
        case FD_CLOSE:
            sock.Close();
            break;
    }
}

測試指標

  • 連線成功率:多次嘗試成功次數 / 總次數。
  • 平均 RTT:TCP 三向交握 + 請求/回應時間 (毫秒)。
  • 吞吐量 (可選):大檔案下載速度。
  • 服務識別:解析回應標頭 (HTTP Server、SMTP Banner、SSH Version)。

多執行緒/並發測試

  • 每個目標 IP:Port 配一個測試執行緒 (或使用 I/O 完成埠 IOCP 統一管理)。
  • 主執行緒收集結果,更新列表控件 (IP、Port、狀態、RTT、狀態碼)。
  • 支援停止、導出 CSV/HTML 報告。

擴展功能

  • UDP 服務測試 (DNS、NTP、SNMP):sendto/recvfrom + 超時重試。
  • SSL/TLS 服務測試:整合 OpenSSL SSL_connect、驗證憑證鏈、檢查過期日。
  • IPv6 支援:AF_INET6、sockaddr_in6。
  • Proxy 測試:HTTP CONNECT、SOCKS5 握手。

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