绑定函数中的 C++ socketio 分段错误
C++ socketio segmentation fault in bound function
这是我关于 Whosebug 的第一个问题,我是 C++ 的新手。我希望大家能原谅我对这里可能很明显的问题的无知,但我很茫然。
基本上,我只是想在我的 C++ 客户端中捕获由 nodejs 服务器发出的事件。我已经成功地编译了我的二进制文件(导入的 boost 和 socketio)和许多困难。我正在尝试通过 websocket 连接发出事件,但我首先需要确保连接成功。我一直主要关注 link 中的教程:https://socket.io/blog/socket-io-cpp/. I've also been following the source code, which can be found here: https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT
出于某种原因,当我在我的绑定函数(在 SocketHandler class 的 onConnected 函数中)访问我的 _io 指针时,我似乎遇到了段错误。
我确定我在做一些愚蠢的事情,但我们将不胜感激。也许我误解了 std::bind 函数的用法?我来自一个主要 javascript 的世界。
main.cpp
#include "sockethandler.h"
int main()
{
SocketHandler sh;
}
sockethandler.cpp
#include <iostream>
#include "sockethandler.h"
const char name[13] = "raspberry_pi";
SocketHandler::SocketHandler() :
_io(new client())
{
using std::placeholders::_1;
_io->set_socket_open_listener(std::bind(&SocketHandler::OnConnected,this,_1));
_io->connect("http://127.0.0.1:3000");
_io->socket()->on("bot-command", [&](sio::event& ev) {
std::cout << "GOT IT!" << "\n";
//handle login message
//post to UI thread if any UI updating.
});
}
void SocketHandler::OnConnected(std::string const& nsp)
{
std::cout << "CONNECTED" << "\n";
// I can access a private class variable such as _a as a string
// here
_io->socket()->emit("join");
}
sockethandler.h
#ifndef SOCKETHANDLER_H
#define SOCKETHANDLER_H
#include <sio_client.h>
using namespace sio;
class SocketHandler {
public:
explicit SocketHandler();
private:
void OnConnected(std::string const& nsp);
std::unique_ptr<client> _io;
};
#endif // SOCKETHANDLER_H
很确定您使用的套接字 io 库是线程化的。您的对象已创建,设置回调(包括对自身的引用),构造函数退出,主退出和自动(堆栈)变量 sh
被销毁。然后套接字 io 库尝试 运行 不再引用有效对象的回调,它崩溃了。在你的 SocketHandler
析构函数中放置一个调试语句,比如 cerr << "destructor called" << endl;
我很确定你总是会在程序崩溃之前看到它被调用。
为了向自己证明这一点,将 sleep(10);
或其他任何代码作为主代码的最后一行以阻止它退出,我猜你会看到你的程序成功。
这是我关于 Whosebug 的第一个问题,我是 C++ 的新手。我希望大家能原谅我对这里可能很明显的问题的无知,但我很茫然。
基本上,我只是想在我的 C++ 客户端中捕获由 nodejs 服务器发出的事件。我已经成功地编译了我的二进制文件(导入的 boost 和 socketio)和许多困难。我正在尝试通过 websocket 连接发出事件,但我首先需要确保连接成功。我一直主要关注 link 中的教程:https://socket.io/blog/socket-io-cpp/. I've also been following the source code, which can be found here: https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT
出于某种原因,当我在我的绑定函数(在 SocketHandler class 的 onConnected 函数中)访问我的 _io 指针时,我似乎遇到了段错误。
我确定我在做一些愚蠢的事情,但我们将不胜感激。也许我误解了 std::bind 函数的用法?我来自一个主要 javascript 的世界。
main.cpp
#include "sockethandler.h"
int main()
{
SocketHandler sh;
}
sockethandler.cpp
#include <iostream>
#include "sockethandler.h"
const char name[13] = "raspberry_pi";
SocketHandler::SocketHandler() :
_io(new client())
{
using std::placeholders::_1;
_io->set_socket_open_listener(std::bind(&SocketHandler::OnConnected,this,_1));
_io->connect("http://127.0.0.1:3000");
_io->socket()->on("bot-command", [&](sio::event& ev) {
std::cout << "GOT IT!" << "\n";
//handle login message
//post to UI thread if any UI updating.
});
}
void SocketHandler::OnConnected(std::string const& nsp)
{
std::cout << "CONNECTED" << "\n";
// I can access a private class variable such as _a as a string
// here
_io->socket()->emit("join");
}
sockethandler.h
#ifndef SOCKETHANDLER_H
#define SOCKETHANDLER_H
#include <sio_client.h>
using namespace sio;
class SocketHandler {
public:
explicit SocketHandler();
private:
void OnConnected(std::string const& nsp);
std::unique_ptr<client> _io;
};
#endif // SOCKETHANDLER_H
很确定您使用的套接字 io 库是线程化的。您的对象已创建,设置回调(包括对自身的引用),构造函数退出,主退出和自动(堆栈)变量 sh
被销毁。然后套接字 io 库尝试 运行 不再引用有效对象的回调,它崩溃了。在你的 SocketHandler
析构函数中放置一个调试语句,比如 cerr << "destructor called" << endl;
我很确定你总是会在程序崩溃之前看到它被调用。
为了向自己证明这一点,将 sleep(10);
或其他任何代码作为主代码的最后一行以阻止它退出,我猜你会看到你的程序成功。