绑定函数中的C ++ socketio分段错误

时间:2018-11-09 02:53:49

标签: c++ c++11 socket.io segmentation-fault stdbind

这是我关于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

由于某种原因,当我在绑定函数(在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");
}

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

1 个答案:

答案 0 :(得分:1)

请确保您正在使用的套接字io库是线程化的。创建您的对象,设置回调(包括对自身的引用),构造函数退出,主出口退出,并且自动(堆栈)变量sh被破坏。然后,套接字io库尝试运行不再具有对有效对象的引用的回调,并且崩溃。将调试语句放在SocketHandler这样的cerr << "destructor called" << endl;析构函数中,我很确定您在程序崩溃之前总是会看到该调用。

要向自己证明这一点,请在主程序中放置sleep(10);或其他任何代码作为最后一行,以阻止其退出,我猜您会看到您的程序成功。