flutter实现UDP发送魔法包唤醒主机

魔法包

复制代码
魔法包是用16进制表示的数据包,它是由固定的前缀数据(FFFFFFFFFFFF)以及固定重复次数(16次)的目标主机MAC地址组成。
假设目标主机的MAC地址是:"50:eb:f6:27:ae:a8"
那么魔法包就是[FFFFFFFFFFFF50EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA850EBF627AEA8]

实现代码

dart 复制代码
import 'dart:io';

void sendWOLPacket(String host, String mac) async {
  // 将MAC地址转换为字节序列
  List<int> macBytes = mac.split(':').map((s) => int.parse(s, radix: 16)).toList();

  // 构造魔术包
  List<int> packet = List.filled(6, 0xFF) + List<int>.generate(16 * macBytes.length, (index) => macBytes[index % macBytes.length]);

  RawDatagramSocket? _socket;
  try {
    _socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);
    // 创建UDP Socket并发送魔术包
    _socket.broadcastEnabled = true;
    for (var i = 0; i < 5; i++) {
      _socket.send(packet, InternetAddress(host), 0);
      await Future.delayed(const Duration(milliseconds: 150));
      _socket.send(packet, InternetAddress(host), 7);
      await Future.delayed(const Duration(milliseconds: 150));
      _socket.send(packet, InternetAddress(host), 9);
      await Future.delayed(const Duration(milliseconds: 150));
    }
    print("success", "发送完成");
  } catch (e) {
    print("error", "出错了;$e");
  }
  _socket?.close();
}
相关推荐
Zelman12 小时前
TCP 协议
网络协议·tcp/ip
javaDocker13 小时前
16.5 小时,我打掉了两只「SSL 握手失败」的怪
网络·网络协议·ssl
m0_7381858214 小时前
Flutter 鸿蒙化实战:flutter_scankit 适配 OpenHarmony,华为 ScanKit 扫码
flutter·华为·harmonyos·鸿蒙
我就是不信15 小时前
TCP 原理详解:从三次握手到拥塞控制
网络·网络协议·tcp/ip
我就是不信15 小时前
TCP/IP 网络编程:从入门到实战
网络·网络协议·tcp/ip
骑着蜗牛撵大象32718 小时前
Agent 打字机是怎么来的:SSE 与 WebSocket 打通实时响应与中间状态
网络·websocket·网络协议·agent·sse·实时通信·流式输出
Frank_refuel18 小时前
分布式RPC框架实战(二):服务端模块划分与底层设计
分布式·网络协议·rpc
web打印社区19 小时前
C-Lodop 提示未准备好或 WebSocket 没准备好:先让本机服务起来
javascript·网络·websocket·网络协议·pdf·html
勇往直前plus19 小时前
HTTPS 详解
网络协议·http·https
wdfk_prog20 小时前
Wi-Fi Direct 源码分析(11):P2P-GROUP-STARTED 之后——Group Interface、IP 配置与真实数据通路
运维·服务器·网络协议·tcp/ip·asp.net·p2p·wifi-direct