現象
- 本機
127.0.0.1 連接正常;
- 換成路由器分配的內網 IP(或公網 IP)客戶端連不上;
- 單機雙進程測試。
核心原因排查清單
- 服務端綁定地址:
IPAddress.Any (0.0.0.0) 監聽所有網卡,**不能**綁定 127.0.0.1 或具體內網 IP;
- 防火牆入站規則:Windows 防火牆/第三方安全軟體需放行服務端監聽端口(TCP);
- 路由器端口映射(跨公網時):外網 IP:Port → 內網服務器 IP:Port,且 ISP 未封鎖該端口;
- 雙邊 IP 版本一致:雙方均為 IPv4 或均為 IPv6,避免 IPv6 回環導致連不上;
- 客戶端連接目標:同一局域網用內網 IP,跨公網用公網 IP + 映射端口。
服務端正確綁定示例
var listener = new TcpListener(IPAddress.Any, 8888); // 監聽所有介面
listener.Start();
// 或 Socket 寫法
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, 8888));
socket.Listen(100);
快速驗證步驟
- 服務端啟動後,本機 CMD 執行
netstat -an | findstr 8888,確認 0.0.0.0:8888 LISTENING;
- 同局域網另一台機器
telnet 服務端內網IP 8888,能連通說明代碼無誤,問題在防火牆/映射;
- 排除法:關閉防火牆測試 → 開啟防火牆加規則 → 配置路由器映射 → 測試公網連接。
附:完整服務端骨架(含線程池、異步、優雅關閉)
// 參考原始代碼,核心修正:Bind(IPAddress.Any) + 防火牆放行