Socket 客戶端在本機與同機測試通訊正常,部署到其他電腦卻連不上,ping 也不通。這不是程式問題,是網路拓撲與防火牆問題。本文提供系統性排查清單,先搞定網路連通性,再調試代碼。
Ping 不通,Socket 必不通。
ICMP (Ping) 是 TCP/IP 基礎連通性驗證,連 ICMP 都不通,TCP 三次握手包根本到不了對端。
192.168.1.100(實體網卡靜態 IP)192.168.1.x(同網段)
// 錯誤:綁定 INADDR_ANY 但防火牆攔截
serv.sin_addr.s_addr = htonl(INADDR_ANY);
// 正確:顯式綁定實體網卡 IP
serv.sin_addr.s_addr = inet_addr("192.168.1.100");
// Client 機器 CMD
ping 192.168.1.100 // 必須通
telnet 192.168.1.100 5000 // 必須連上(閃爍光標即成功)
// PowerShell
Test-NetConnection 192.168.1.100 -Port 5000
| 錯誤 | 修正 |
|---|---|
serv.sin_port=5000 | serv.sin_port=htons(5000) (網路序) |
setsockopt 後分號導致判斷失效 | 刪除 if(...); 尾部分號 |
Client connect 未檢查錯誤碼 | 用 WSAGetLastError() 打印具體原因 |
recv 緩衝區未清零 | memset(buff, 0, sizeof(buff)) |
netcat (nc) 或 telnet 驗證埠連通,排除代碼問題netstat -an | findstr 5000 確認 LISTENING 狀態「內網 Ping 公網失敗」本質是網路層不通。按「同網段 → 靜態 IP → 防火牆開埠 → Ping 通 → Telnet 通 → 再跑代碼」順序排查,99% 問題在防火牆、虛擬網卡、AP 隔離三大塊。代碼層面注意 htons、setsockopt 分號、錯誤碼打印三個低級錯誤。