
本文详解“目标机器主动拒绝连接”错误(127.0.0.1:1026)的根本原因,重点指出本地回环地址(127.0.0.1)仅限本机通信,跨设备连接必须绑定实际网卡ip并确保网络可达。
本文详解“目标机器主动拒绝连接”错误(127.0.0.1:1026)的根本原因,重点指出本地回环地址(127.0.0.1)仅限本机通信,跨设备连接必须绑定实际网卡ip并确保网络可达。
当C#客户端尝试连接 127.0.0.1:1026 时抛出 No connection could be made because the target machine actively refused it,这并非网络不通,而是服务端根本未在该地址+端口上监听有效连接。核心问题在于:127.0.0.1 是本地回环地址(loopback),仅响应本机发起的连接请求;若客户端与Python服务端运行在不同物理设备或虚拟机上(如题中所述“不同机器、同一局域网”),服务端必须绑定其实际局域网IP(如 192.168.1.105)或通配地址 0.0.0.0,才能接收外部主机的TCP连接。
✅ 正确的服务端绑定方式(Python)
将原代码中的 bind((Host, Port)) 修改为绑定真实IP或全网接口:
import socket
def StartServer(Host, Port, Log):
ServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ✅ 方案1:绑定本机局域网IP(需替换为实际IP,如 '192.168.1.105')
ServerSocket.bind((Host, Port))
# ✅ 方案2(推荐调试):绑定 0.0.0.0,监听所有可用网卡
# ServerSocket.bind(('0.0.0.0', Port))
ServerSocket.listen(1)
Log.log(f"Listening on {Host}:{Port}")
while True:
ClientSocket, Addr = ServerSocket.accept()
Log.log(f"Connection from {Addr}")
data = ClientSocket.recv(1024).decode("utf-8")
response = "data received"
ClientSocket.send(response.encode("utf-8"))
ClientSocket.close()? 如何获取本机局域网IP?
- Windows:ipconfig → 查找 IPv4 Address(非 127.0.0.1 或 169.254.x.x)
- macOS/Linux:ifconfig | grep "inet " | grep -v 127.0.0.1
✅ 客户端调用保持不变,但地址需匹配服务端绑定IP
C#客户端应使用服务端的实际局域网IP(而非 127.0.0.1):
// ❌ 错误:仅对本机有效
// SendData("127.0.0.1", 1026);
// ✅ 正确:使用服务端真实IP(如 '192.168.1.105')
SendData("192.168.1.105", 1026);⚠️ 关键注意事项
- 防火墙与端口放行:即使禁用系统防火墙,也需确认路由器/企业防火墙未拦截 1026 端口;Windows Defender 防火墙中需为Python进程或端口添加入站规则。
- 服务端是否真正运行? 启动Python服务后,执行 netstat -an | findstr :1026(Windows)或 lsof -i :1026(macOS/Linux)验证监听状态,输出应包含 LISTENING 及对应IP。
- 避免 127.0.0.1 与 localhost 混淆:二者均属回环,无法跨设备通信;生产环境严禁在服务端绑定此类地址。
- 端口可用性验证:使用 telnet 192.168.1.105 1026(Windows)或 nc -zv 192.168.1.105 1026(Linux/macOS)从客户端机器测试连通性——若超时说明网络层不通,若拒绝说明服务未监听。
? 总结
actively refused 错误本质是TCP三次握手阶段服务端发送RST包,表明“该地址+端口无进程监听”。解决路径唯一且明确:服务端弃用 127.0.0.1,改用实际网卡IP或 0.0.0.0 绑定;客户端同步使用该IP连接;辅以防火墙检查与端口连通性验证。此原则适用于所有跨设备TCP通信场景(Python/Node.js/Java/C#等),是网络编程的基础共识。

















