使用Socket+Ngrok建立TCP隧道时遇getaddrinfo失败错误求助
解决socket连接ngrok TCP隧道的getaddrinfo错误
我用socket模块写了简单的服务端代码,通过ngrok将本地监听的5002端口转发为TCP隧道,生成的转发地址为tcp://0.tcp.in.ngrok.io:18376。但客户端代码使用该地址连接时触发错误:socket.gaierror: [Errno 11001] getaddrinfo failed,修改客户端host参数(去掉端口)也没解决问题,求指导正确连接方式。
问题根源
你的客户端代码存在两个关键错误:
- host参数格式错误:
socket.connect()要求传入的主机地址不能带tcp://协议前缀,否则DNS解析会直接失败。 - 端口参数错误:你传入了本地服务端的端口5002,但客户端应该连接ngrok隧道分配的端口18376,而非本地端口。
修正后的客户端代码
import socket # 提取ngrok隧道的主机地址(去掉tcp://前缀)和对应端口 host = "0.tcp.in.ngrok.io" port = 18376 # 使用ngrok生成的端口,不是本地的5002 client = socket.socket() client.connect((host, port)) mess = input("Enter message::") while mess != 'q': client.send(mess.encode()) data = client.recv(1024).decode() print("FROM SERVER = ", data) mess = input("Enter message ::") client.close()
额外注意事项
- 服务端可将
host改为"0.0.0.0",这样能接受来自任意网卡的连接,避免仅绑定localhost可能带来的限制(当前ngrok转发到localhost:5002,原代码也能工作,但修改后兼容性更强)。 - 确保ngrok进程处于运行状态,隧道未断开或过期。
- 客户端所在网络需能正常访问ngrok服务器,避免防火墙拦截。
内容的提问来源于stack exchange,提问作者user20336969
相关产品推荐
相关产品推荐

