Перечисление Ipv6MulticastScope

#![allow(unused)]
fn main() {
#[non_exhaustive]
pub enum Ipv6MulticastScope {
    InterfaceLocal,
    LinkLocal,
    RealmLocal,
    AdminLocal,
    SiteLocal,
    OrganizationLocal,
    Global,
}
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Область действия IPv6 многоадресного адреса, как определено в IETF RFC 7346, раздел 2.

Гарантии стабильности

Не все возможные значения для многоадресной области были назначены. Будущие RFC могут вводить новые области, которые будут добавлены как варианты в это перечисление; из-за этого перечисление помечено как #[non_exhaustive].

Примеры

#![allow(unused)]
#![feature(ip)]

fn main() {
use std::net::Ipv6Addr;
use std::net::Ipv6MulticastScope::*;

// IPv6 многоадресный адрес с глобальной областью действия (`ff0e::`).
let address = Ipv6Addr::new(0xff0e, 0, 0, 0, 0, 0, 0, 0);

// Напечатает "Global scope".
match address.multicast_scope() {
    Some(InterfaceLocal) => println!("Interface-Local scope"),
    Some(LinkLocal) => println!("Link-Local scope"),
    Some(RealmLocal) => println!("Realm-Local scope"),
    Some(AdminLocal) => println!("Admin-Local scope"),
    Some(SiteLocal) => println!("Site-Local scope"),
    Some(OrganizationLocal) => println!("Organization-Local scope"),
    Some(Global) => println!("Global scope"),
    Some(_) => println!("Unknown scope"),
    None => println!("Not a multicast address!")
}
}

Варианты (Не исчерпывающие)

Это перечисление помечено как не исчерпывающее

InterfaceLocal

#![allow(unused)]
fn main() {
InterfaceLocal
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Область действия в пределах интерфейса.

LinkLocal

#![allow(unused)]
fn main() {
LinkLocal
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Область действия в пределах канала (link).

RealmLocal

#![allow(unused)]
fn main() {
RealmLocal
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Область действия в пределах REALM.

AdminLocal

#![allow(unused)]
fn main() {
AdminLocal
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Административно-локальная область действия.

SiteLocal

#![allow(unused)]
fn main() {
SiteLocal
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Область действия в пределах сайта.

OrganizationLocal

#![allow(unused)]
fn main() {
OrganizationLocal
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Область действия в пределах организации.

Global

#![allow(unused)]
fn main() {
Global
}

🔬 Это экспериментальное API, доступное только в ночных сборках. (ip #27709)

Глобальная область действия.

Трайт-реализации

Clone для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl Clone for Ipv6MulticastScope
}

clone

#![allow(unused)]
fn main() {
fn clone(&self) -> Ipv6MulticastScope
}

Возвращает дубликат значения. Подробнее

clone_from

#![allow(unused)]
fn main() {
fn clone_from(&mut self, source: &Self)
}

Выполняет присваивание копированием из источника. Подробнее

Debug для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl Debug for Ipv6MulticastScope
}

fmt

#![allow(unused)]
fn main() {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>
}

Форматирует значение с помощью заданного форматировщика. Подробнее

Hash для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl Hash for Ipv6MulticastScope
}

hash

#![allow(unused)]
fn main() {
fn hash<__H>(&self, state: &mut __H)
where
    __H: Hasher,
}

Подает это значение в заданный Hasher. Подробнее

hash_slice

#![allow(unused)]
fn main() {
fn hash_slice<H>(data: &[Self], state: &mut H)
where
    H: Hasher,
    Self: Sized,
}

Подает срез этого типа в заданный Hasher. Подробнее

PartialEq для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl PartialEq for Ipv6MulticastScope
}

eq

#![allow(unused)]
fn main() {
fn eq(&self, other: &Ipv6MulticastScope) -> bool
}

Проверяет равенство значений self и other, используется оператором ==.

ne

#![allow(unused)]
fn main() {
fn ne(&self, other: &Rhs) -> bool
}

Проверяет неравенство (!=). Реализация по умолчанию почти всегда достаточна и не должна переопределяться без очень веской причины.

Copy для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl Copy for Ipv6MulticastScope
}

Eq для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl Eq for Ipv6MulticastScope
}

StructuralPartialEq для Ipv6MulticastScope

#![allow(unused)]
fn main() {
impl StructuralPartialEq for Ipv6MulticastScope
}

Автоматические реализации трейтов

#![allow(unused)]
fn main() {
impl Freeze for Ipv6MulticastScope
impl RefUnwindSafe for Ipv6MulticastScope
impl Send for Ipv6MulticastScope
impl Sync for Ipv6MulticastScope
impl Unpin for Ipv6MulticastScope
impl UnwindSafe for Ipv6MulticastScope
}

Стандартные реализации

#![allow(unused)]
fn main() {
impl<T> Any for T
where
    T: 'static + ?Sized,

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

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

impl<T> CloneToUninit for T
where
    T: Clone,

impl<T> From<T> for T

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

impl<T> ToOwned for T
where
    T: Clone,

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

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

Примеры использования

Анализ многоадресных областей IPv6

#![feature(ip)]

use std::net::{Ipv6Addr, Ipv6MulticastScope};

fn analyze_multicast_addresses() {
    let multicast_addresses = [
        // Различные многоадресные адреса с разными областями
        Ipv6Addr::new(0xff01, 0, 0, 0, 0, 0, 0, 0x1),  // Interface-Local
        Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0x1),  // Link-Local
        Ipv6Addr::new(0xff03, 0, 0, 0, 0, 0, 0, 0x1),  // Realm-Local
        Ipv6Addr::new(0xff04, 0, 0, 0, 0, 0, 0, 0x1),  // Admin-Local
        Ipv6Addr::new(0xff05, 0, 0, 0, 0, 0, 0, 0x1),  // Site-Local
        Ipv6Addr::new(0xff08, 0, 0, 0, 0, 0, 0, 0x1),  // Organization-Local
        Ipv6Addr::new(0xff0e, 0, 0, 0, 0, 0, 0, 0x1),  // Global
    ];
    
    println!("Анализ IPv6 многоадресных областей:");
    
    for addr in &multicast_addresses {
        print!("Адрес: {:39} -> ", addr);
        
        match addr.multicast_scope() {
            Some(Ipv6MulticastScope::InterfaceLocal) => {
                println!("Interface-Local (в пределах интерфейса)");
            }
            Some(Ipv6MulticastScope::LinkLocal) => {
                println!("Link-Local (в пределах канала)");
            }
            Some(Ipv6MulticastScope::RealmLocal) => {
                println!("Realm-Local (в пределах REALM)");
            }
            Some(Ipv6MulticastScope::AdminLocal) => {
                println!("Admin-Local (административно-локальная)");
            }
            Some(Ipv6MulticastScope::SiteLocal) => {
                println!("Site-Local (в пределах сайта)");
            }
            Some(Ipv6MulticastScope::OrganizationLocal) => {
                println!("Organization-Local (в пределах организации)");
            }
            Some(Ipv6MulticastScope::Global) => {
                println!("Global (глобальная)");
            }
            Some(_) => {
                println!("Неизвестная область");
            }
            None => {
                println!("Не многоадресный адрес");
            }
        }
    }
}

fn main() {
    analyze_multicast_addresses();
}

Использование в сетевых приложениях

#![feature(ip)]

use std::net::{Ipv6Addr, Ipv6MulticastScope};
use std::collections::HashMap;

struct MulticastManager {
    scopes: HashMap<Ipv6MulticastScope, Vec<Ipv6Addr>>,
}

impl MulticastManager {
    fn new() -> Self {
        Self {
            scopes: HashMap::new(),
        }
    }
    
    fn add_multicast_address(&mut self, addr: Ipv6Addr) {
        if let Some(scope) = addr.multicast_scope() {
            self.scopes.entry(scope).or_insert_with(Vec::new).push(addr);
        }
    }
    
    fn print_scopes(&self) {
        println!("Многоадресные адреса по областям:");
        
        for (scope, addresses) in &self.scopes {
            let scope_name = match scope {
                Ipv6MulticastScope::InterfaceLocal => "Interface-Local",
                Ipv6MulticastScope::LinkLocal => "Link-Local",
                Ipv6MulticastScope::RealmLocal => "Realm-Local",
                Ipv6MulticastScope::AdminLocal => "Admin-Local",
                Ipv6MulticastScope::SiteLocal => "Site-Local",
                Ipv6MulticastScope::OrganizationLocal => "Organization-Local",
                Ipv6MulticastScope::Global => "Global",
            };
            
            println!("  {} ({} адресов):", scope_name, addresses.len());
            for addr in addresses {
                println!("    - {}", addr);
            }
        }
    }
    
    fn get_addresses_by_scope(&self, scope: Ipv6MulticastScope) -> &[Ipv6Addr] {
        self.scopes.get(&scope).map(|v| v.as_slice()).unwrap_or(&[])
    }
}

fn main() {
    let mut manager = MulticastManager::new();
    
    // Добавляем различные многоадресные адреса
    let multicast_addrs = [
        Ipv6Addr::new(0xff01, 0, 0, 0, 0, 0, 0, 0x1),  // all-nodes interface-local
        Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0x1),  // all-nodes link-local
        Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0x2),  // all-routers link-local
        Ipv6Addr::new(0xff05, 0, 0, 0, 0, 0, 0, 0x1),  // all-nodes site-local
        Ipv6Addr::new(0xff0e, 0, 0, 0, 0, 0, 0, 0x1),  // global multicast
    ];
    
    for addr in &multicast_addrs {
        manager.add_multicast_address(*addr);
    }
    
    manager.print_scopes();
    
    // Получаем адреса для конкретной области
    println!("\nLink-Local адреса:");
    for addr in manager.get_addresses_by_scope(Ipv6MulticastScope::LinkLocal) {
        println!("  - {}", addr);
    }
}

Сравнение и хеширование областей

#![feature(ip)]

use std::net::Ipv6MulticastScope;
use std::collections::HashSet;

fn demonstrate_comparison_and_hashing() {
    let scopes = [
        Ipv6MulticastScope::InterfaceLocal,
        Ipv6MulticastScope::LinkLocal,
        Ipv6MulticastScope::RealmLocal,
        Ipv6MulticastScope::AdminLocal,
        Ipv6MulticastScope::SiteLocal,
        Ipv6MulticastScope::OrganizationLocal,
        Ipv6MulticastScope::Global,
        Ipv6MulticastScope::LinkLocal, // Дубликат
    ];
    
    println!("Демонстрация сравнения и хеширования:");
    
    // Использование в HashSet (автоматически удаляет дубликаты)
    let unique_scopes: HashSet<_> = scopes.iter().collect();
    println!("Уникальные области в HashSet: {}", unique_scopes.len());
    
    for scope in &unique_scopes {
        println!("  - {:?}", scope);
    }
    
    // Сравнение областей
    println!("\nСравнение областей:");
    let scope1 = Ipv6MulticastScope::LinkLocal;
    let scope2 = Ipv6MulticastScope::LinkLocal;
    let scope3 = Ipv6MulticastScope::Global;
    
    println!("  scope1 == scope2: {}", scope1 == scope2);
    println!("  scope1 == scope3: {}", scope1 == scope3);
    println!("  scope1 != scope3: {}", scope1 != scope3);
    
    // Клонирование и копирование
    println!("\nКлонирование и копирование:");
    let original = Ipv6MulticastScope::SiteLocal;
    let cloned = original.clone();
    let copied = original;
    
    println!("  original: {:?}", original);
    println!("  cloned: {:?}", cloned);
    println!("  copied: {:?}", copied);
    println!("  original == cloned: {}", original == cloned);
    println!("  original == copied: {}", original == copied);
}

fn main() {
    demonstrate_comparison_and_hashing();
}

Области многоадресной рассылки IPv6

Области многоадресной рассылки определяют, как далеко могут распространяться многоадресные пакеты:

  • Interface-Local: В пределах одного сетевого интерфейса
  • Link-Local: В пределах одного сетевого сегмента (link)
  • Realm-Local: В пределах REALM (определяется спецификацией)
  • Admin-Local: Административно ограниченная область
  • Site-Local: В пределах одного сайта или здания
  • Organization-Local: В пределах одной организации
  • Global: Глобальная область действия (вся сеть Интернет)

Особенности использования

Не исчерпывающее перечисление

Перечисление помечено как #[non_exhaustive], что означает, что в будущем могут быть добавлены новые варианты. Это требует от пользователей обрабатывать возможные неизвестные варианты при использовании сопоставления с образцом.

Экспериментальный статус

Это API является экспериментальным и доступно только в ночных сборках Rust. Для использования необходимо включить функцию #![feature(ip)].