fache 0.1.351

发车工具箱
Documentation
#[cfg(feature = "system")]
#[allow(dead_code)]
pub mod woltokio {
    use {Deserialize, Serialize};
    use std::io;
    use tokio::net::UdpSocket; // 改为使用 Tokio 的 UdpSocket

    #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct MagicPacket {
        pub mac: String,
        pub ip: String, // 用于构造广播地址
    }

    impl MagicPacket {
        fn create_magic_packet(mac: &str) -> io::Result<Vec<u8>> {
            let mut packet = Vec::new();
            packet.extend([0xFF; 6]);
            let mac_bytes = mac
                .split(':')
                .map(|byte| u8::from_str_radix(byte, 16))
                .collect::<Result<Vec<u8>, _>>()
                .unwrap();
            for _ in 0..16 {
                packet.extend(&mac_bytes);
            }
            Ok(packet)
        }

        pub async fn send(&self) -> io::Result<()> {
            // 异步绑定 UDP 套接字
            let socket = UdpSocket::bind("0.0.0.0:0").await?;
            
            // 同步设置广播选项(Tokio 的 UdpSocket 直接暴露了标准库的方法)
            socket.set_broadcast(true)?;
            
            // 构造广播地址(注意: 标准 WOL 应使用 255.255.255.255:9 或特定子网广播地址)
            let broadcast_address = format!("{}:9", self.ip);
            
            // 构造魔术包
            let magic_packet = Self::create_magic_packet(&self.mac)?;
            
            // 异步发送数据包
            socket.send_to(&magic_packet, broadcast_address).await?;
            
            Ok(())
        }
    }
}