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); } }
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; } } }