mirror of
https://github.com/snltty/linker.git
synced 2025-09-26 21:15:57 +08:00
182
This commit is contained in:
@@ -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])
|
||||
|
@@ -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++)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -1,5 +1,5 @@
|
||||
v1.8.2
|
||||
2025-06-06 15:21:28
|
||||
2025-06-06 16:33:47
|
||||
1. 一些累计更新
|
||||
2. 重建权限存储,ulong改为BitArray,同组所有客户端需保持版本一致
|
||||
3. 增加唤醒功能,支持WOL,COM继电器,HID继电器
|
||||
|
Reference in New Issue
Block a user