#include "networkthread.h" #include NetworkThread::NetworkThread(QObject *parent) : QObject(parent), context(1) { } void NetworkThread::connect() { socket = new zmq::socket_t(context, zmq::socket_type::pair); int linger = 0; socket->setsockopt(ZMQ_LINGER, &linger, sizeof (linger)); try { socket->bind("tcp://127.0.0.1:12345"); } catch (zmq::error_t err) { qDebug() << "failed binding socket" << err.what(); emit error(err.what()); throw; }; qDebug() << "connected"; } void NetworkThread::disconnect() { delete socket; qDebug() << "disconnected"; } void NetworkThread::reconnect() { this->disconnect(); this->connect(); } void NetworkThread::process() { connect(); while(true) { zmq::message_t response; const auto ret = socket->recv(response, zmq::recv_flags::dontwait); if(!ret) { continue; } json j; try { j = json::parse(response.to_string()); } catch (nlohmann::detail::parse_error& err) { qDebug() << err.what(); qDebug() << "malformed json received " << response.to_string().c_str(); } //std::cout << std::setw(4) << j << "\n\n"; std::string msg_type; if(!json_get(j, msg_type, "msg")) { qDebug() << "broken message received " << response.to_string().c_str(); } else if(msg_type == "response") { qDebug() << "received " << msg_type.c_str(); emit httpMessage(j); } else if(msg_type == "request") { qDebug() << "received " << msg_type.c_str(); } else if(msg_type == "ping") { qDebug() << "received " << msg_type.c_str(); } else { qDebug() << "unknown or broken message type received: " << msg_type.c_str(); } qDebug() << "sending ack"; std::string m = "{\"msg\": \"ack\"}"; socket->send(zmq::buffer(m.c_str(), m.length()), zmq::send_flags::dontwait); } }