Beispiel #1
0
void
av::NetNodeServer::cast(av::Msg& av_msg)
{
  zmq::message_t zmq_message(av_msg.getSize());
  memcpy(zmq_message.data(), av_msg.getBuffer(), av_msg.getSize());
  mSocket.send(zmq_message);
}
Beispiel #2
0
int main(int argc, char* argv[])
{
    setup_signal(SIGTERM, signal_exit);
    setup_signal(SIGINT, signal_exit);

    /* google log */
    google::InitGoogleLogging(argv[0]);
    google::InstallFailureSignalHandler();
    google::LogToStderr();

    const char* id = "simple-node";
    if (argc > 1)
        id = argv[1];

    try
    {
        terra::message msg;
        msg.set_id(id);
        msg.set_type(terra::message::HEARTBEAT);

        zmq::context_t ctx(1);
        zmq::socket_t socket(ctx, ZMQ_PUB);
        socket.connect("tcp://localhost:60300");

        msg.set_heartbeat(0);

        while (run)
        {
            msg.set_timestamp(terra::timestamp::now());

            zmq::message_t zmq_message(msg.ByteSize());
            msg.SerializeToArray(zmq_message.data(), zmq_message.size());

            LOG(INFO) << "sending message { size = " << zmq_message.size() << " }";
            socket.send(zmq_message);
            msg.set_heartbeat(msg.heartbeat() + 1);

            sleep(2);
        }

        socket.close();
    }
    catch (const std::exception& e)
    {
        LOG(ERROR) << "ERROR: " << e.what();
    }

    return EXIT_SUCCESS;
}
bool OTSocket_ZMQ_4::Send(const OTASCIIArmor & ascEnvelope)
{
    if (!m_bInitialized) { OT_FAIL; }

    if (0 >= ascEnvelope.GetLength())  { OTLog::vError("%s: Error: %s is zero length!\n", __FUNCTION__, "ascEnvelope");	OT_FAIL; }
    m_ascLastMsgSent.Set(ascEnvelope); // In case we need to re-send.

    if (!m_HasContext) { OT_FAIL; }
    if (NULL == m_pzmq->context_zmq)  { OTLog::vError("%s: Error: %s must exist to Send!\n", __FUNCTION__, "m_pzmq->context_zmq");	OT_FAIL; }

    if (!m_bConnected && !m_bListening) return false;
    if (m_bConnected && m_bListening) return false;
    if (NULL == m_pzmq->socket_zmq) { OTLog::vError("%s: Error: %s must exist to Send!\n", __FUNCTION__, "m_pzmq->socket_zmq");	OT_FAIL; }


    // -----------------------------------	
    const int64_t lLatencySendMilliSec = m_lLatencySendMs;

    zmq::message_t zmq_message(ascEnvelope.GetLength());
    memcpy((void*)zmq_message.data(), ascEnvelope.Get(), ascEnvelope.GetLength());

    bool bSuccessSending = false;

    if (m_bIsBlocking)
    {
        try {
            bSuccessSending = m_pzmq->socket_zmq->send(zmq_message); // Blocking.
        }
        catch (std::exception& e) {
            OTLog::vError("%s: Exception Caught: %s \n", __FUNCTION__, e.what());
            OT_FAIL;
        }
    }
    else // not blocking
    {
        int32_t		nSendTries = m_nLatencySendNoTries;
        int64_t	lDoubling = lLatencySendMilliSec;
        bool	bKeepTrying = true;

        while (bKeepTrying && (nSendTries > 0))
        {
            zmq::pollitem_t items[] = {
                { (*m_pzmq->socket_zmq), 0, ZMQ_POLLOUT, 0 }
            };

            int nPoll = 0;
            try {
                nPoll = zmq::poll(&items[0], 1, static_cast<long>(lDoubling));	// ZMQ_POLLOUT, 1 item, timeout (milliseconds)	
            }
            catch (std::exception& e) {
                OTLog::vError("%s: Exception Caught: %s \n", __FUNCTION__, e.what());
                OT_FAIL;
            }

            lDoubling *= 2;

            if (items[0].revents & ZMQ_POLLOUT)
            {
                try {
                    bSuccessSending = m_pzmq->socket_zmq->send(zmq_message, ZMQ_NOBLOCK); // <=========== SEND ===============
                }
                catch (std::exception& e) {
                    OTLog::vError("%s: Exception Caught: %s \n", __FUNCTION__, e.what());
                    OT_FAIL;
                }

                OTLog::SleepMilliseconds(1);

                if (!bSuccessSending)
                {
                    if (false == HandleSendingError())
                        bKeepTrying = false;
                }
                else
                    break; // (Success -- we're done in this loop.)
            }
            else if ((-1) == nPoll) // error.
            {
                if (false == HandlePollingError())
                    bKeepTrying = false;
            }

            --nSendTries;
        }
    }
    /*
    Normally, we try to send...
    If the send fails, we wait X ms and then try again (Y times).

    BUT -- what if the failure was an errno==EAGAIN ?
    In that case, it's not a REAL failure, but rather, a "failure right now, try again in a sec."
    */
    // ***********************************

    if (bSuccessSending)
        OTLog::SleepMilliseconds(m_lLatencyDelayAfter > 0 ? m_lLatencyDelayAfter : 1);

    return bSuccessSending;
}
Beispiel #4
0
/* Plugin: Multithreaded loop. */
void InputPlugin::operator()()
{
    try
    {        
        /* ZMQ: Create framework subscription socket on this thread. */
        zmq::socket_t zmq_framework_subscriber (*this->zmq_context.get(), ZMQ_SUB);
        
        /* ZMQ: Connect. */
        zmq_framework_subscriber.connect("inproc://Framework");

        /* ZMQ: Suscribe to all messages. */
        zmq_framework_subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
        
        std::this_thread::sleep_for(std::chrono::milliseconds( 10 ));
        
        /* OIS: Initialization.*/
        OIS::ParamList pl;
        std::ostringstream wnd; 
        wnd << this->base_window.get()->native_window();
        pl.insert(std::make_pair(std::string("WINDOW"), wnd.str()));
        pl.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false")));
        pl.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false")));
        pl.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));

        
        auto ois_manager = OIS::InputManager::createInputSystem(pl);

        /* OIS: Print debugging information. */
        auto ois_info = std::string("-----OIS-----\n") + 
            "Version: " + ois_manager->getVersionName() + "\n" +
            "Manager: " + ois_manager->inputSystemName() + "\n" +
            "Total keyboards: " + std::to_string(ois_manager->getNumberOfDevices(OIS::OISKeyboard)) + "\n" +
            "Total mice: " + std::to_string(ois_manager->getNumberOfDevices(OIS::OISMouse)) + "\n" +
            "Total gamepads: " + "-" + "\n" +
            "Total joysticks: " + std::to_string(ois_manager->getNumberOfDevices(OIS::OISJoyStick));

        std::cout << ois_info << std::endl;

        /* OIS: Keyboard initialization. */
        auto ois_keyboard = static_cast<OIS::Keyboard*>(ois_manager->createInputObject( OIS::OISKeyboard, false));
        
        /* ZMQ: Send ready message. */
        {
            zeug::string_hash message("Ready");
            zmq::message_t zmq_message_send(message.Size());
            memcpy(zmq_message_send.data(), message.Get(), message.Size()); 
            this->zmq_input_publisher->send(zmq_message_send);
        }
        
        /* ZMQ: Listen for start message. */
        for(;;)
        {
            zmq::message_t zmq_message;
            if (zmq_framework_subscriber.recv(&zmq_message, ZMQ_NOBLOCK)) 
            {
                if (zeug::string_hash("Start") == zeug::string_hash(zmq_message.data()))
                {
                    break;
                }
            }
        }
        
        /* Plugin: Loop. */        
        for(;;)
        {          
            /* ZMQ: Listen for stop message. */
            {
                zmq::message_t zmq_message;
                if (zmq_framework_subscriber.recv(&zmq_message, ZMQ_NOBLOCK)) 
                {
                    if (zeug::string_hash("Stop") == zeug::string_hash(zmq_message.data()))
                    {
                        break;
                    }
                }
            }
            
            if (this->base_window->poll())
            {
                /* OIS: Handle input */
                ois_keyboard->capture();
                if( ois_keyboard->isKeyDown( OIS::KC_ESCAPE )) 
                {
                    /* Topic */
                    {
                        zeug::string_hash message("Keyboard");
                        zmq::message_t zmq_message(message.Size());
                        memcpy(zmq_message.data(), message.Get(), message.Size()); 
                        zmq_input_publisher->send(zmq_message, ZMQ_SNDMORE);
                    }
                    /* Message */
                    {
                        zeug::string_hash message("Esc");
                        zmq::message_t zmq_message(message.Size());
                        memcpy(zmq_message.data(), message.Get(), message.Size()); 
                        zmq_input_publisher->send(zmq_message, ZMQ_SNDMORE);
                    }
                    /* End of message. */
                    {
                        zeug::string_hash message("Finish");
                        zmq::message_t zmq_message(message.Size());
                        memcpy(zmq_message.data(), message.Get(), message.Size()); 
                        zmq_input_publisher->send(zmq_message);
                    }
                }
                else if( ois_keyboard->isKeyDown( OIS::KC_RETURN )) 
                {
                    /* Topic */
                    {
                        zeug::string_hash message("Keyboard");
                        zmq::message_t zmq_message(message.Size());
                        memcpy(zmq_message.data(), message.Get(), message.Size()); 
                        zmq_input_publisher->send(zmq_message, ZMQ_SNDMORE);
                    }
                    /* Message */
                    {
                        zeug::string_hash message("Enter");
                        zmq::message_t zmq_message(message.Size());
                        memcpy(zmq_message.data(), message.Get(), message.Size()); 
                        zmq_input_publisher->send(zmq_message, ZMQ_SNDMORE);
                    }
                    /* End of message. */
                    {
                        zeug::string_hash message("Finish");
                        zmq::message_t zmq_message(message.Size());
                        memcpy(zmq_message.data(), message.Get(), message.Size()); 
                        zmq_input_publisher->send(zmq_message);
                    }
                }
            }
        }
    }
    /* Plugin: Catch plugin specific exceptions and rethrow them as runtime error*/
    catch(const OIS::Exception& ois_exception )
    {
        /* ZMQ: Send stop message. */
        zeug::string_hash message("Stop");
        zmq::message_t zmq_message_send(message.Size());
        memcpy(zmq_message_send.data(), message.Get(), message.Size()); 
        this->zmq_input_publisher->send(zmq_message_send);
        
        throw std::runtime_error(std::string(" OIS - ") + ois_exception.eText);
        return;
    }
}