XlxMonitor

Struct XlxMonitor 

Source
pub(crate) struct XlxMonitor {
    socket: UdpSocket,
    peer: SocketAddr,
    reflector: String,
}
Expand description

A UDP client connected to a single XLX reflector’s monitor port.

Manages the UDP socket lifecycle and provides async methods for receiving parsed monitor messages. Create via XlxMonitor::connect and receive events via XlxMonitor::recv.

On drop, a best-effort "bye" datagram is sent to the reflector so it can clean up its client tracking state promptly.

Fields§

§socket: UdpSocket

The bound UDP socket, connected to the reflector’s monitor port.

§peer: SocketAddr

The reflector’s monitor endpoint (ip:10001).

§reflector: String

Reflector callsign for logging and database correlation.

Implementations§

Source§

impl XlxMonitor

Source

pub(crate) async fn connect( ip: IpAddr, reflector: String, ) -> Result<Self, Error>

Connects to a reflector’s XLX monitor port and sends the "hello" handshake.

Binds a new UDP socket on an ephemeral port, “connects” it to the reflector’s monitor address (so that subsequent send/recv calls are scoped to this peer), and sends the initial "hello" datagram.

The reflector will respond with three JSON datagrams (reflector info, nodes snapshot, stations snapshot) which can be read via recv.

§Errors

Returns io::Error if socket binding or the initial send fails.

Source

pub(crate) async fn recv(&self) -> Option<MonitorMessage>

Receives the next monitor message from the reflector.

Blocks (asynchronously) until a UDP datagram arrives or the 30-second timeout expires. Returns:

  • Some(message) — a successfully parsed MonitorMessage.
  • None — the timeout expired (no data received within 30 seconds), or the received datagram was not valid JSON and could not be parsed at all (not even as Unknown).

The caller should treat repeated None returns as a signal that the reflector is unresponsive and consider reconnecting.

Source

pub(crate) const fn peer(&self) -> SocketAddr

Returns the peer socket address (ip:10001).

Trait Implementations§

Source§

impl Debug for XlxMonitor

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Drop for XlxMonitor

Source§

fn drop(&mut self)

Best-effort "bye" on drop.

Uses try_send (non-async, non-blocking) because Drop cannot be async. If the send fails (e.g., the socket is already closed or the runtime is shutting down), the failure is silently ignored — the reflector will eventually time out the client entry on its own.

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.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. 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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,