首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

本地測試 Winsock Server/Client 程式的完整方法(TCP/UDP)

     編輯:程式設計綜合問答

測試環境準備

  • 同一台電腦開啟兩個終端機(命令提示字元 / PowerShell / Terminal)
  • 或使用兩台區域網路電腦
  • 關閉防火牆或開放測試連接埠(如 8080、9090)

方法一:命令列雙開(最簡單)

TCP 測試

# 終端機 1:啟動 Server
server.exe 8080

# 終端機 2:啟動 Client
client.exe 127.0.0.1 8080

Server 端應印出 Accepted connection from 127.0.0.1:xxxxx,Client 端可輸入文字觀察雙向收發。

UDP 測試

# 終端機 1:Server 綁定埠
udp_server.exe 9090

# 終端機 2:Client 指定目標
udp_client.exe 127.0.0.1 9090

UDP 無連線,Server 需在 recvfrom 取得客戶端位址後才能 sendto 回覆。

方法二:使用網路除錯工具(推薦)

工具平台特色
Hercules SETUP UtilityWindows支援 TCP Server/Client、UDP、Serial,GUI 操作,顯示十六進位/ASCII
Packet Sender跨平台可儲存指令序列、支援 Hex/ASCII、命令列模式
netcat (nc)Linux/macOS/WSLnc -l 8080 (Server)、nc 127.0.0.1 8080 (Client)
socatLinux強大的雙向管道,socat - TCP4:127.0.0.1:8080
Wireshark跨平台封包擷取分析,驗證封包格式、重傳、檢查碼

方法三:單機多進程自動化測試(程式碼)

// C# 範例:啟動 Server 執行緒,主執行緒跑 Client
var serverThread = new Thread(() => {
    var server = new TcpListener(IPAddress.Loopback, 0);
    server.Start();
    int port = ((IPEndPoint)server.LocalEndpoint).Port;
    Console.WriteLine($"Server listening on {port}");
    using (var client = server.AcceptTcpClient())
    using (var stream = client.GetStream())
    {
        byte[] buf = new byte[1024];
        int n = stream.Read(buf, 0, buf.Length);
        Console.WriteLine("Server received: " + Encoding.UTF8.GetString(buf, 0, n));
        stream.Write(Encoding.UTF8.GetBytes("ACK from Server"));
    }
    server.Stop();
});
serverThread.Start();
Thread.Sleep(200); // 等 Server 就緒

// Client 連線
using (var client = new TcpClient())
{
    client.Connect(IPAddress.Loopback, port);
    using (var stream = client.GetStream())
    {
        stream.Write(Encoding.UTF8.GetBytes("Hello Server"));
        byte[] buf = new byte[1024];
        int n = stream.Read(buf, 0, buf.Length);
        Console.WriteLine("Client received: " + Encoding.UTF8.GetString(buf, 0, n));
    }
}
serverThread.Join();

常見問題排查

現象可能原因檢查步驟
Client 連線逾時Server 未綁定/監聽正確 IP:Portnetstat -an | findstr 8080 確認 LISTENING
UDP 收不到資料Client 未送至正確 IP/Port,或 Server 未 recvfromWireshark 擷取 UDP 封包,確認目的位址
本機通、區網不通防火牆阻擋、Server 綁定 127.0.0.1 而非 0.0.0.0Server 改 bind(0.0.0.0),開放防火牆規則
資料亂碼編碼不一致、未處理黏包/半包定義協定(長度前綴/分隔符),指定 UTF-8

進階:自動化整合測試

  • 單元測試框架(GoogleTest、Catch2、xUnit)啟動真實 Socket
  • CI/CD Pipeline 中用 Docker Compose 起 Server 容器,Client 容器測試
  • 模擬網路故障:tc qdisc add dev lo root netem loss 10% delay 50ms

總結

本地測試 Winsock 程式最直接方式是開兩個命令視窗分別跑 Server/Client;搭配 Hercules、netcat 等工具可免寫 Client 快速驗證 Server;區網測試注意綁定 0.0.0.0 與防火牆;自動化測試可在單元測試中啟動真實 Socket 或使用容器編排。

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