Ejemplo n.º 1
0
    void send (PeerFinder::Slot::ptr const& slot,
        std::vector <PeerFinder::Endpoint> const& endpoints)
    {
        typedef std::vector <PeerFinder::Endpoint> List;
        protocol::TMEndpoints tm;
        for (List::const_iterator iter (endpoints.begin());
            iter != endpoints.end(); ++iter)
        {
            PeerFinder::Endpoint const& ep (*iter);
            protocol::TMEndpoint& tme (*tm.add_endpoints());
            if (ep.address.is_v4())
                tme.mutable_ipv4()->set_ipv4(
                    toNetworkByteOrder (ep.address.to_v4().value));
            else
                tme.mutable_ipv4()->set_ipv4(0);
            tme.mutable_ipv4()->set_ipv4port (ep.address.port());

            tme.set_hops (ep.hops);
        }

        tm.set_version (1);

        PackedMessage::pointer msg (
            boost::make_shared <PackedMessage> (
                tm, protocol::mtENDPOINTS));

        {
            std::lock_guard <decltype(m_mutex)> lock (m_mutex);
            PeersBySlot::iterator const iter (m_peers.find (slot));
            assert (iter != m_peers.end ());
            PeerImp::ptr const peer (iter->second.lock());
            assert (peer != nullptr);
            peer->sendPacket (msg, false);
        }
    }
Ejemplo n.º 2
0
    void sendPeerEndpoints (PeerFinder::PeerID const& id,
        std::vector <PeerFinder::Endpoint> const& endpoints)
    {
        bassert (! endpoints.empty());

        typedef std::vector <PeerFinder::Endpoint> List;
        protocol::TMEndpoints tm;

        for (List::const_iterator iter (endpoints.begin());
            iter != endpoints.end(); ++iter)
        {
            PeerFinder::Endpoint const& ep (*iter);
            protocol::TMEndpoint& tme (*tm.add_endpoints());

            if (ep.address.isV4())
                tme.mutable_ipv4()->set_ipv4(
                    toNetworkByteOrder (ep.address.v4().value));
            else
                tme.mutable_ipv4()->set_ipv4(0);
            tme.mutable_ipv4()->set_ipv4port (ep.address.port());

            tme.set_hops (ep.hops);
            tme.set_slots (ep.incomingSlotsAvailable);
            tme.set_maxslots (ep.incomingSlotsMax);
            tme.set_uptimeseconds (ep.uptimeSeconds);
            tme.set_features (ep.featureList);
        }

        PackedMessage::pointer msg (
            boost::make_shared <PackedMessage> (
                tm, protocol::mtENDPOINTS));

        std::vector <Peer::pointer> list = getPeerVector ();
        BOOST_FOREACH (Peer::ref peer, list)
        {
            if (peer->isConnected() &&
                PeerFinder::PeerID (peer->getNodePublic()) == id)
            {
                peer->sendPacket (msg, false);
                break;
            }
        }
    }