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

为何该WebSocket客户端main函数末尾陷入无限循环?删除循环会触发段错误?

#include <libwebsockets.h>
#include "src/libs/callback.h"
#include "src/libs/websocket_client.h"

class websocket : public websocket_client, public client_callback_t {
    bool run_ = true;
public:
    websocket() : websocket_client(this, "ws-feed.pro.coinbase.com") {}

    [[nodiscard]] bool working() const noexcept { return run_; }

    void on_connected() override {
        lwsl_user("client connected\n");
        std::string msg = R"({ "type": "subscribe", "product_ids": [ "ETH-USD", "ETH-EUR" ], "channels": [ "level2", "heartbeat", { "name": "ticker", "product_ids": [ "ETH-BTC", "ETH-USD" ] } ] })";
        send(msg.data(), msg.size());
    }

    void on_disconnected() override {
        lwsl_user("client disconnected\n");
    }

    void on_error(const char *msg, size_t len) override {
        lwsl_user("client error\n");
    }

    void on_data(const char *data, size_t len, size_t remaining) override {
        std::string msg(data, len);
        lwsl_user("data from server: %s\n", msg.c_str());
    }
};

int main() {
    lws_set_log_level(LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, nullptr);
    websocket client;
    client.connect();
    while (client.working()) {
    }
    return 0;
}

问题

  1. 该WebSocket客户端为何会在main函数末尾进入无限循环?
  2. main函数中的while循环作用是什么?为何删除此循环后程序会出现段错误?

解答

1. 无限循环的原因

websocket类里的run_成员初始值为true,但代码里所有回调函数(比如连接断开、错误触发时的回调)都没有修改run_的值,导致client.working()始终返回true,while循环的条件一直成立,因此进入无限循环。

2. while循环的作用与删除后段错误的原因

  • 循环的作用:拖住主线程,不让程序提前退出,保证WebSocket客户端的后台事件处理逻辑(比如接收服务器消息、维护连接状态)能正常运行。
  • 删除后段错误的原因:如果去掉这个循环,main函数会直接执行到return 0,此时局部变量client会因为出作用域被销毁。但client.connect()启动的WebSocket后台处理逻辑(比如libwebsockets的事件循环、回调函数)可能还在运行,这些逻辑会尝试访问已经被销毁的client对象内存,从而触发段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:50:27