这是我在stackerflow上的第一个问题,我是C++的新手。我希望你们都能原谅我对这里可能显而易见的问题的无知,但我不知所措。
基本上,我只是想在C++客户端中捕获nodejs服务器发出的事件。我已经成功地编译了我的二进制文件(导入的boost和socketio(和许多hardache。我试图通过websocket连接发出一个事件,但我首先需要确保连接成功。我一直在关注这个链接上的教程:https://socket.io/blog/socket-io-cpp/.我也一直在关注源代码,可以在这里找到:https://github.com/socketio/socket.io-client-cpp/tree/master/examples/QT
出于某种原因,当我访问绑定函数(在SocketHandler类的onConnected函数中(中的_io指针时,我似乎遇到了segfault。
我确信我在做一些傻事,但任何帮助都是感激的。也许我误解了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
非常确定您使用的套接字io库是线程化的。创建对象,设置回调(包括对自身的引用(,构造函数退出,主退出,自动(堆栈(变量sh
被销毁。然后套接字io库尝试运行回调,该回调不再引用有效对象,并且崩溃。在你的SocketHandler
析构函数中放入一个调试语句,比如cerr << "destructor called" << endl;
,我相信你总是会在程序崩溃之前看到它被调用。
为了向自己证明这一点,在main中放一个sleep(10);
或其他什么作为最后一行代码,阻止它退出,我猜你会看到你的程序成功的。