You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用libwebsockets接收WebSocket连接?连接建立失败求助

排查libwebsockets WebSocket连接失败的问题

先别急,咱们一步步来拆解你遇到的WebSocket连接失败问题:

  • 首先,确认你用的示例是否支持WebSocket
    很多libwebsockets的默认示例确实是做HTTP静态文件服务的,这类示例根本没配置WebSocket协议的处理逻辑。你得找专门的WebSocket示例,比如官方的test-server或者echo-server,这些示例才注册了WebSocket协议的处理回调,能处理连接升级请求。如果用错了示例,自然会出现一堆错误日志。

  • 检查你的curl测试命令是否正确
    你当前的curl命令有两个关键问题:

    1. 请求URL用了http://,WebSocket请求应该用ws://协议头;
    2. 缺少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错误的核心原因之一。

  • 验证服务器端的路径配置
    就算你用了支持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(不支持的扩展,可能是请求里带了服务器没配置的扩展头)
      这些错误都指向握手阶段的协议不匹配,和前面提到的命令错误、示例选择错误直接相关。
  • 推荐的调试步骤

    1. 先启动官方的echo-server示例,用上面的正确curl命令或者浏览器的WebSocket客户端测试,确认服务器能正常处理WebSocket连接;
    2. 参考echo-server的代码,修改你自己的服务器配置:注册WebSocket协议结构体,绑定到指定的/blah路径;
    3. 开启libwebsockets的详细日志(比如设置日志级别为LL_DEBUG),这样能看到握手过程的每一步细节,更容易定位问题。

内容的提问来源于stack exchange,提问作者codenamezero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:24:56