mirror of
https://github.com/snltty/linker.git
synced 2025-09-27 05:25:57 +08:00
182
This commit is contained in:
@@ -140,16 +140,20 @@ namespace linker.libs.extends
|
|||||||
{
|
{
|
||||||
return BitConverter.GetBytes(num);
|
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;
|
ref ushort v = ref value;
|
||||||
fixed (void* p = &v)
|
fixed (void* p = &v)
|
||||||
{
|
{
|
||||||
var span = new Span<byte>(p, sizeof(ushort));
|
var _span = new Span<byte>(p, sizeof(ushort));
|
||||||
memory.Span[0] = span[0];
|
span[0] = _span[0];
|
||||||
memory.Span[1] = span[1];
|
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)
|
public static unsafe void ToBytes(this ushort[] value, Memory<byte> memory)
|
||||||
{
|
{
|
||||||
fixed (void* p = &value[0])
|
fixed (void* p = &value[0])
|
||||||
|
@@ -87,7 +87,7 @@ namespace linker.libs.websocket
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string BuildSecWebSocketKey()
|
public static string BuildSecWebSocketKey()
|
||||||
{
|
{
|
||||||
byte[] bytes = new byte[16];
|
Span<byte> bytes = stackalloc byte[16];
|
||||||
Random random = new Random(DateTime.Now.Ticks.GetHashCode());
|
Random random = new Random(DateTime.Now.Ticks.GetHashCode());
|
||||||
for (int i = 0; i < bytes.Length; i++)
|
for (int i = 0; i < bytes.Length; i++)
|
||||||
{
|
{
|
||||||
|
@@ -17,8 +17,7 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
}
|
}
|
||||||
|
|
||||||
//最多是IPV6 16字节+加头部4字节
|
//最多是IPV6 16字节+加头部4字节
|
||||||
Memory<byte> memory = new byte[20];
|
Span<byte> span = stackalloc byte[20];
|
||||||
Span<byte> span = memory.Span;
|
|
||||||
|
|
||||||
value.TryWriteBytes(span.Slice(1), out int bytesWritten);
|
value.TryWriteBytes(span.Slice(1), out int bytesWritten);
|
||||||
|
|
||||||
|
@@ -18,8 +18,7 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
}
|
}
|
||||||
|
|
||||||
//最多 IPV6 16byte + 端口 2byte + 头部 4byte
|
//最多 IPV6 16byte + 端口 2byte + 头部 4byte
|
||||||
Memory<byte> memory = new byte[22];
|
Span<byte> span = stackalloc byte[22];
|
||||||
Span<byte> span = memory.Span;
|
|
||||||
int index = 1;
|
int index = 1;
|
||||||
|
|
||||||
value.Address.TryWriteBytes(span.Slice(index), out int bytesWritten);
|
value.Address.TryWriteBytes(span.Slice(index), out int bytesWritten);
|
||||||
@@ -27,7 +26,7 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
span[0] = (byte)bytesWritten;
|
span[0] = (byte)bytesWritten;
|
||||||
|
|
||||||
ushort port = (ushort)value.Port;
|
ushort port = (ushort)value.Port;
|
||||||
port.ToBytes(memory.Slice(index));
|
port.ToBytes(span.Slice(index));
|
||||||
index += 2;
|
index += 2;
|
||||||
|
|
||||||
writer.WriteCollectionHeader(index + 4);
|
writer.WriteCollectionHeader(index + 4);
|
||||||
|
@@ -3,6 +3,8 @@ using linker.libs;
|
|||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
using static linker.libs.winapis.User32;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace linker.messenger.wakeup
|
namespace linker.messenger.wakeup
|
||||||
{
|
{
|
||||||
@@ -77,7 +79,7 @@ namespace linker.messenger.wakeup
|
|||||||
{
|
{
|
||||||
return info.Type switch
|
return info.Type switch
|
||||||
{
|
{
|
||||||
WakeupType.Wol => await SendWol(info),
|
WakeupType.Wol => SendWol(info),
|
||||||
WakeupType.Com => await SendCom(info),
|
WakeupType.Com => await SendCom(info),
|
||||||
WakeupType.Hid => await SendHid(info),
|
WakeupType.Hid => await SendHid(info),
|
||||||
_ => false
|
_ => false
|
||||||
@@ -92,33 +94,40 @@ namespace linker.messenger.wakeup
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
private async Task<bool> SendWol(WakeupSendInfo info)
|
private bool SendWol(WakeupSendInfo info)
|
||||||
{
|
{
|
||||||
try
|
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();
|
using UdpClient client = new UdpClient();
|
||||||
client.EnableBroadcast = true;
|
client.EnableBroadcast = true;
|
||||||
client.Client.WindowsUdpBug();
|
client.Client.WindowsUdpBug();
|
||||||
|
client.Send(magicPacket, new IPEndPoint(IPAddress.Parse("255.255.255.255"), 9));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -129,6 +138,16 @@ namespace linker.messenger.wakeup
|
|||||||
}
|
}
|
||||||
return false;
|
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)
|
private async Task<bool> SendCom(WakeupSendInfo info)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@@ -183,7 +183,7 @@ namespace linker.messenger
|
|||||||
{
|
{
|
||||||
length = 2;
|
length = 2;
|
||||||
responseData = ArrayPool<byte>.Shared.Rent(length);
|
responseData = ArrayPool<byte>.Shared.Rent(length);
|
||||||
num.ToBytes(responseData);
|
num.ToBytes(responseData.AsSpan());
|
||||||
ResponseData = responseData.AsMemory(0, length);
|
ResponseData = responseData.AsMemory(0, length);
|
||||||
}
|
}
|
||||||
public void Write(ushort[] nums)
|
public void Write(ushort[] nums)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
v1.8.2
|
v1.8.2
|
||||||
2025-06-06 15:21:28
|
2025-06-06 16:33:47
|
||||||
1. 一些累计更新
|
1. 一些累计更新
|
||||||
2. 重建权限存储,ulong改为BitArray,同组所有客户端需保持版本一致
|
2. 重建权限存储,ulong改为BitArray,同组所有客户端需保持版本一致
|
||||||
3. 增加唤醒功能,支持WOL,COM继电器,HID继电器
|
3. 增加唤醒功能,支持WOL,COM继电器,HID继电器
|
||||||
|
Reference in New Issue
Block a user