Ошибка сегментации сокета C ++ в связанной функции - PullRequest
0 голосов
/ 09 ноября 2018

Это мой первый вопрос по stackoverflow, и я новичок в C ++. Я надеюсь, что вы все простите мое невежество в отношении, вероятно, очевидной проблемы здесь, но я в растерянности.

По сути, я просто пытаюсь перехватить события, генерируемые сервером nodejs в моем клиенте C ++. Я успешно скомпилировал свой бинарный файл (импортированные boost и socketio) и много хардчака. Я пытаюсь отправить событие через соединение через веб-сокет, но сначала мне нужно убедиться, что соединение успешно. Я в основном следовал учебному пособию по этой ссылке: https://socket.io/blog/socket-io-cpp/. Я также следил за исходным кодом, который можно найти здесь: https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT

По какой-то причине у меня возникает ошибка, когда я получаю доступ к своему указателю _io в моей связанной функции (в функции onConnected класса SocketHandler).

Я уверен, что делаю что-то глупое, но любая помощь приветствуется. Может быть, я неправильно понимаю использование функции 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 голосов
/ 09 ноября 2018

Уверен, что используемая вами библиотека socket io является многопоточной. Ваш объект создан, устанавливает обратный вызов (который включает в себя ссылки на себя), конструктор завершает работу, главные выходы и автоматическая (стек) переменная sh уничтожается. Затем библиотека сокетов io пытается запустить обратный вызов, который больше не имеет ссылок на действительный объект, и происходит сбой. Поместите оператор отладки в ваш SocketHandler деструктор, например cerr << "destructor called" << endl;, и я уверен, что вы всегда увидите, что он вызывается до сбоя программы.

Чтобы доказать это самому себе, поставьте sleep(10); или что-то еще в качестве последней строки кода в вашем главном, чтобы остановить его от выхода, и я предполагаю, что вы увидите, что ваша программа выполнена успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...