这是我关于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
答案 0 :(得分:1)
请确保您正在使用的套接字io库是线程化的。创建您的对象,设置回调(包括对自身的引用),构造函数退出,主出口退出,并且自动(堆栈)变量sh
被破坏。然后,套接字io库尝试运行不再具有对有效对象的引用的回调,并且崩溃。将调试语句放在SocketHandler
这样的cerr << "destructor called" << endl;
析构函数中,我很确定您在程序崩溃之前总是会看到该调用。
要向自己证明这一点,请在主程序中放置sleep(10);
或其他任何代码作为最后一行,以阻止其退出,我猜您会看到您的程序成功。