This commit is contained in:
snltty
2025-06-06 16:33:47 +08:00
parent 43ae3ec4e3
commit 362d5a9210
7 changed files with 54 additions and 33 deletions

View File

@@ -140,16 +140,20 @@ namespace linker.libs.extends
{
return BitConverter.GetBytes(num);
}
public static unsafe void ToBytes(this ushort value, Memory<byte> memory)
public static unsafe void ToBytes(this ushort value, Span<byte> span)
{
ref ushort v = ref value;
fixed (void* p = &v)
{
var span = new Span<byte>(p, sizeof(ushort));
memory.Span[0] = span[0];
memory.Span[1] = span[1];
var _span = new Span<byte>(p, sizeof(ushort));
span[0] = _span[0];
span[1] = _span[1];
}
}
public static unsafe void ToBytes(this ushort value, Memory<byte> memory)
{
value.ToBytes(memory.Span);
}
public static unsafe void ToBytes(this ushort[] value, Memory<byte> memory)
{
fixed (void* p = &value[0])

View File

@@ -87,7 +87,7 @@ namespace linker.libs.websocket
/// <returns></returns>
public static string BuildSecWebSocketKey()
{
byte[] bytes = new byte[16];
Span<byte> bytes = stackalloc byte[16];
Random random = new Random(DateTime.Now.Ticks.GetHashCode());
for (int i = 0; i < bytes.Length; i++)
{

View File

@@ -17,8 +17,7 @@ namespace linker.messenger.serializer.memorypack
}
//最多是IPV6 16字节+加头部4字节
Memory<byte> memory = new byte[20];
Span<byte> span = memory.Span;
Span<byte> span = stackalloc byte[20];
value.TryWriteBytes(span.Slice(1), out int bytesWritten);

View File

@@ -18,8 +18,7 @@ namespace linker.messenger.serializer.memorypack
}
//最多 IPV6 16byte + 端口 2byte + 头部 4byte
Memory<byte> memory = new byte[22];
Span<byte> span = memory.Span;
Span<byte> span = stackalloc byte[22];
int index = 1;
value.Address.TryWriteBytes(span.Slice(index), out int bytesWritten);
@@ -27,7 +26,7 @@ namespace linker.messenger.serializer.memorypack
span[0] = (byte)bytesWritten;
ushort port = (ushort)value.Port;
port.ToBytes(memory.Slice(index));
port.ToBytes(span.Slice(index));
index += 2;
writer.WriteCollectionHeader(index + 4);

View File

@@ -3,6 +3,8 @@ using linker.libs;
using linker.libs.extends;
using System.Net;
using System.Net.Sockets;
using static linker.libs.winapis.User32;
using System.Text.RegularExpressions;
namespace linker.messenger.wakeup
{
@@ -77,7 +79,7 @@ namespace linker.messenger.wakeup
{
return info.Type switch
{
WakeupType.Wol => await SendWol(info),
WakeupType.Wol => SendWol(info),
WakeupType.Com => await SendCom(info),
WakeupType.Hid => await SendHid(info),
_ => false
@@ -92,33 +94,40 @@ namespace linker.messenger.wakeup
}
return false;
}
private async Task<bool> SendWol(WakeupSendInfo info)
private bool SendWol(WakeupSendInfo info)
{
try
{
string macAddress = info.Value.Replace(":", "").Replace("-", "").Replace(" ", "").ToUpper();
//MAC地址格式XX:XX:XX:XX:XX:XX 或者 XX-XX-XX-XX-XX-XX 或者 XXXXXXXXXXXX 转字节数组
ReadOnlySpan<char> macAddress = info.Value.AsSpan();
Span<byte> macBytes = stackalloc byte[6];
int byteIndex = 0;
for (int i = 0; i < macAddress.Length && byteIndex < 6; i++)
{
char c = macAddress[i];
if (char.IsAsciiHexDigit(c))
{
if (i + 1 < macAddress.Length && char.IsAsciiHexDigit(macAddress[i + 1]))
{
macBytes[byteIndex++] = (byte)((HexToNibble(c) << 4) | HexToNibble(macAddress[i + 1]));
i++;
}
}
}
Span<byte> magicPacket = stackalloc byte[102];
//6个连续的0xFF
stackalloc byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }.CopyTo(magicPacket.Slice(0, 6));
//16个重复的MAC地址
for (int i = 1; i <= 16; i++)
{
macBytes.CopyTo(magicPacket.Slice(i * 6, 6));
}
using UdpClient client = new UdpClient();
client.EnableBroadcast = true;
client.Client.WindowsUdpBug();
byte[] macBytes = Enumerable.Range(0, macAddress.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(macAddress.Substring(x, 2), 16))
.ToArray();
byte[] magicPacket = new byte[102];
for (int i = 0; i < 6; i++)
{
magicPacket[i] = 0xFF;
}
for (int i = 1; i <= 16; i++)
{
Array.Copy(macBytes, 0, magicPacket, i * 6, 6);
}
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 9);
await client.SendAsync(magicPacket, magicPacket.Length, endPoint);
client.Send(magicPacket, new IPEndPoint(IPAddress.Parse("255.255.255.255"), 9));
}
catch (Exception ex)
{
@@ -129,6 +138,16 @@ namespace linker.messenger.wakeup
}
return false;
}
private static byte HexToNibble(char c)
{
return (byte)(char.ToUpperInvariant(c) switch
{
>= '0' and <= '9' => c - '0',
>= 'A' and <= 'F' => c - 'A' + 10,
_ => throw new FormatException($"Invalid hex character: {c}")
});
}
private async Task<bool> SendCom(WakeupSendInfo info)
{
try

View File

@@ -183,7 +183,7 @@ namespace linker.messenger
{
length = 2;
responseData = ArrayPool<byte>.Shared.Rent(length);
num.ToBytes(responseData);
num.ToBytes(responseData.AsSpan());
ResponseData = responseData.AsMemory(0, length);
}
public void Write(ushort[] nums)

View File

@@ -1,5 +1,5 @@
v1.8.2
2025-06-06 15:21:28
2025-06-06 16:33:47
1. 一些累计更新
2. 重建权限存储ulong改为BitArray同组所有客户端需保持版本一致
3. 增加唤醒功能支持WOLCOM继电器HID继电器