如何使用libwebsockets接收WebSocket连接?连接建立失败求助
排查libwebsockets WebSocket连接失败的问题
先别急,咱们一步步来拆解你遇到的WebSocket连接失败问题:
首先,确认你用的示例是否支持WebSocket
很多libwebsockets的默认示例确实是做HTTP静态文件服务的,这类示例根本没配置WebSocket协议的处理逻辑。你得找专门的WebSocket示例,比如官方的test-server或者echo-server,这些示例才注册了WebSocket协议的处理回调,能处理连接升级请求。如果用错了示例,自然会出现一堆错误日志。检查你的curl测试命令是否正确
你当前的curl命令有两个关键问题:- 请求URL用了
http://,WebSocket请求应该用ws://协议头; - 缺少WebSocket握手必需的
Sec-WebSocket-Key和Sec-WebSocket-Version头。
正确的测试命令应该是这样的:
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: 123.0.0.1" -H "Origin: http://123.0.0.1" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" -H "Sec-WebSocket-Version: 13" ws://123.0.0.1/blah缺少这些头的话,服务器根本无法完成WebSocket握手,这也是你看到那些Reason错误的核心原因之一。
- 请求URL用了
验证服务器端的路径配置
就算你用了支持WebSocket的示例,也要确认服务器是否把/blah这个路径绑定到了WebSocket协议上。在libwebsockets的代码里,需要通过struct lws_protocols数组注册协议,并且在创建vhost的时候指定对应的路径匹配规则。如果路径不匹配,服务器会直接拒绝升级请求。解读那些Reason错误码
你看到的Reason 17、29、35都是libwebsockets的内部错误码,对应具体的问题:- Reason 17:
LWS_CLOSE_STATUS_PROTOCOL_ERROR(协议错误,握手不符合规范) - Reason 29:
LWS_CLOSE_STATUS_INVALID_FRAME_PAYLOAD_DATA(无效的帧数据,通常是握手阶段格式不对) - Reason 35:
LWS_CLOSE_STATUS_UNSUPPORTED_EXTENSION(不支持的扩展,可能是请求里带了服务器没配置的扩展头)
这些错误都指向握手阶段的协议不匹配,和前面提到的命令错误、示例选择错误直接相关。
- Reason 17:
推荐的调试步骤
- 先启动官方的
echo-server示例,用上面的正确curl命令或者浏览器的WebSocket客户端测试,确认服务器能正常处理WebSocket连接; - 参考
echo-server的代码,修改你自己的服务器配置:注册WebSocket协议结构体,绑定到指定的/blah路径; - 开启libwebsockets的详细日志(比如设置日志级别为
LL_DEBUG),这样能看到握手过程的每一步细节,更容易定位问题。
- 先启动官方的
内容的提问来源于stack exchange,提问作者codenamezero
相关产品推荐
相关产品推荐

