예제 #1
0
파일: publisher.cpp 프로젝트: 865651819/zeq
    void _initService( const uint32_t announceMode )
    {
        initURI();
        if( !( announceMode & ANNOUNCE_ZEROCONF ))
            return;

        const bool required = announceMode & ANNOUNCE_REQUIRED;
        if( !servus::Servus::isAvailable( ))
        {
            if( required )
                ZEQTHROW( std::runtime_error(
                              "No zeroconf implementation available" ));
            return;
        }

        _service.set( "Instance", detail::Sender::getUUID().getString( ));

        const servus::Servus::Result& result =
            _service.announce( uri.getPort(), getAddress( ));

        if( required && !result )
        {
            ZEQTHROW( std::runtime_error( "Zeroconf announce failed: " +
                                          result.getString( )));
        }
    }
예제 #2
0
    Impl( const URI& uri_, const std::string& session )
        : detail::Sender( uri_, 0, ZMQ_PUB )
        , _service( PUBLISHER_SERVICE )
        , _session( session == DEFAULT_SESSION ? getDefaultSession() : session )
    {
        if( session.empty( ))
            ZEROEQTHROW( std::runtime_error(
                             "Empty session is not allowed for publisher" ));

        const std::string& zmqURI = buildZmqURI( uri );
        if( zmq_bind( socket, zmqURI.c_str( )) == -1 )
        {
            zmq_close( socket );
            socket = 0;
            ZEROEQTHROW( std::runtime_error(
                             std::string( "Cannot bind publisher socket '" ) +
                             zmqURI + "': " + zmq_strerror( zmq_errno( ))));
        }

        initURI();

        if( session != NULL_SESSION )
            _initService();
    }