MdnsService

Struct MdnsService 

Source
pub struct MdnsService { /* private fields */ }
Expand description

A running service that discovers libp2p peers and responds to other libp2p peers’ queries on the local network.

§Usage

In order to use mDNS to discover peers on the local network, use the MdnsService. This is done by creating a MdnsService then polling it in the same way as you would poll a stream.

Polling the MdnsService can produce either an MdnsQuery, corresponding to an mDNS query received by another node on the local network, or an MdnsResponse corresponding to a response to a query previously emitted locally. The MdnsService will automatically produce queries, which means that you will receive responses automatically.

When you receive an MdnsQuery, use the respond method to send back an answer to the node that emitted the query.

When you receive an MdnsResponse, use the provided methods to query the information received in the response.

§Example

let _future_to_poll = async {
    let (mut service, packet) = service.next().await;

    match packet {
        MdnsPacket::Query(query) => {
            println!("Query from {:?}", query.remote_addr());
            let packets = build_query_response(
                query.query_id(),
                my_peer_id.clone(),
                vec![].into_iter(),
                Duration::from_secs(120),
            );
            for packet in packets {
                service.enqueue_response(packet);
            }
        }
        MdnsPacket::Response(response) => {
            for peer in response.discovered_peers() {
                println!("Discovered peer {:?}", peer.id());
                for addr in peer.addresses() {
                    println!("Address = {:?}", addr);
                }
            }
        }
        MdnsPacket::ServiceDiscovery(disc) => {
            let resp = build_service_discovery_response(
                disc.query_id(),
                Duration::from_secs(120),
            );
            service.enqueue_response(resp);
        }
    }
};

Implementations§

Source§

impl MdnsService

Source

pub async fn new() -> Result<Self>

Starts a new mDNS service.

Source

pub async fn silent() -> Result<Self>

Same as new, but we don’t automatically send queries on the network.

Source

pub fn enqueue_response(&mut self, rsp: Vec<u8>)

Source

pub async fn next(self) -> (Self, MdnsPacket)

Returns a future resolving to itself and the next received MdnsPacket.

Trait Implementations§

Source§

impl Debug for MdnsService

Source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> ErasedDestructor for T
where T: 'static,