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

10-11 23:08
查看更多