为何该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; }
问题
- 该WebSocket客户端为何会在main函数末尾进入无限循环?
- 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
相关产品推荐
相关产品推荐

