这是我关于stackoverflow的第一个问题,我是C++的新手。希望大家都可以原谅我对这里可能存在的明显问题的无知,但我很茫然。
基本上,我只是想捕获C++客户端中的nodejs服务器发出的事件。我已经成功地编译了我的二进制文件(导入了boost和socketio)和很多麻烦。我正在尝试通过websocket连接发出事件,但是我首先需要确保连接成功。我主要在以下链接上关注本教程:https://socket.io/blog/socket-io-cpp/。我也一直在关注源代码,可以在这里找到它:https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT
由于某些原因,当我在绑定(bind)函数(在SocketHandler类的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");
}
套接字处理程序
#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);
或任何其他代码作为最后一行来阻止它退出,我猜您会看到您的程序成功。
关于c++ - 绑定(bind)函数中的C++ socketio段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53219187/