應用場景
- 診斷 DNS (53)、SMTP (25)、POP3 (110)、HTTP (80)、FTP (21) 等服務可用性與延遲。
- 多鏡像站點測速,選擇最快下載源。
- 簡易網路效能基準測試。
Socket 程式模型 (MFC CSocket / WinSock)
- 建立 Socket:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) (TCP 連線導向)。
- 非阻塞/異步:
ioctlsocket(s, FIONBIO, &on) 或 WSAAsyncSelect / WSAEventSelect / Overlapped I/O,避免 UI 凍結。
- 連線:
connect(s, (sockaddr*)&addr, sizeof(addr))。非阻塞下立即返回 WSAEWOULDBLOCK,等待 FD_CONNECT 事件。
- 發送測試資料 (可選):如 HTTP
HEAD / HTTP/1.0\r\n\r\n。
- 接收回應:
recv 讀取標頭/內容,計算往返時間 (RTT)。
- 關閉:
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 握手。