Boost 1.67 beast::websocket连接报resolve: Host not found错误求助
问题根因与解决方案
核心错误1:域名与路径参数混淆
Host not found报错的根本原因是你将完整URL(包含路径、查询参数)直接传入了域名解析接口:
tcp::resolver::resolve仅接受纯域名作为参数,不能携带/开头的路径、?开头的查询参数- 路径、查询参数需要传入
ws.handshake的第二个参数,原示例中该参数写死为/,适配自定义服务时需要修改
核心错误2:Shell特殊字符未转义
Unix Shell中&是后台运行标识符,你直接在命令行中传递带&的URL时,Shell会自动截断&后的内容,导致实际传入程序的参数不完整。所有带特殊字符的参数需要用单引号包裹。
核心错误3:协议与端口不匹配
- 非加密
ws协议默认使用80端口,加密wss协议默认使用443端口 - 目前绝大多数公共WebSocket服务、云服务都只开放加密
wss端口,用80端口请求会被服务端直接断开连接
具体修改步骤
1. 代码修改
以SSL版本的客户端代码为例,调整参数逻辑:
// 原参数检查修改为接收4个参数:host、port、path、text if(argc != 5) { std::cerr << "Usage: wsstest <host> <port> <path> <text>\n" << "Example:\n" << " wsstest 'demo.piesocket.com' '443' '/v3/channel_1?api_key=xxx¬ify_self' 'Hello, world!'\n"; return EXIT_FAILURE; } auto const host = argv[1]; auto const port = argv[2]; auto const path = argv[3]; auto const text = argv[4]; // 握手环节修改为传入path变量 ws.handshake(host, path);
2. 编译调整
编译时确保链接了所有必要的依赖库,树莓派环境下建议增加-std=c++17参数兼容Boost 1.67的语法:
g++ -std=c++17 websocket_client_sync_ssl.cpp -o wsstest -lpthread -lboost_system -lcrypto -lssl
3. 运行命令
所有带特殊字符的参数用单引号包裹,示例:
PieSocket测试命令
./wsstest 'demo.piesocket.com' '443' '/v3/channel_1?api_key=oCdCMcMPQpbvNjUIzqtvF1d2X2okWpDQj4AwARJuAgtjhzKxVEjQU6IdCjwm¬ify_self' 'Hello, world!'
Azure WebPubSub测试命令
将你的Azure地址拆分后填写对应参数即可:
- host:
lupo.webpubsub.azure.com - port:
443 - path:
/client/hubs/Hub?access_token=你的有效access_token
其他注意事项
- Yahoo的行情WebSocket服务仅推送指定主题的行情数据,不会响应自定义文本消息,握手后主动断开是服务端的正常逻辑,不属于代码错误
- Azure WebPubSub的access_token有有效期,运行前需要确认token未过期
- 树莓派环境需要提前配置正确的DNS服务器,避免出现真·域名解析失败的问题
内容的提问来源于stack exchange,提问作者mqmarathon
相关产品推荐
相关产品推荐

