#packets #silkroad #packet #define

skrillax-packet

用于将 Silkroad Online 数据包序列化和反序列化为帧的包定义

2个不稳定版本

0.2.0 2024年6月22日
0.1.0 2024年4月28日

#1025 in 编码


2 crates 中使用

MIT 许可证

105KB
1.5K SLoC

skrillax-packet

Crates.io Docs.rs

skrillax-packetskrillax-network 家族中处理 Silkroad Online 客户端和/或服务器之间通信网络部分的 crate 之一。这个 crate 主要负责定义在连接中使用的包,以及从/到单个帧的转换。这个 crate 主要提供了一种特性:[Packet]。虽然您可以自己实现它,但您也可以使用 derive 宏来生成它(这需要 derive 功能)。

文档

有关文档,请参阅 docs.rs 页面

许可证

skrillax-network 的其余 crate 一样,这个 crate 也受 MIT 许可证 的约束。


lib.rs:

这个 crate 主要提供一个特质:[Packet]。虽然您可以自己实现它,但您也可以使用 derive 宏来生成它(这需要 derive 功能)。

#[derive(Packet)]
#[packet(opcode = 0x5001)]
struct MyPacket {
    content: String,
}

这个 crate 的其余部分主要关注将 [Packet] 转换为 [SilkroadFrame],或反之亦然。这目前需要通过使用 [IncomingPacket] 或 [OutgoingPacket] 来绕一个小弯,具体取决于方向。这样做是因为我们通常首先需要对帧应用某种类型的转换,然后才能轻松地将它们转换为表示包的 struct。这包括将多个巨大的帧组合成一个大的缓冲区以及解密帧的内容以确定它们的 opcodes。因此,链的流程如下,以简化的方式。要将包转换为帧: myPacket.serialize().as_frames(context) 要将帧转换为包: IncomingPacket::from_frames(frames, context).try_into_packet::<MyPacket>()

然而,这不仅仅需要[包]实现。您要么需要自己实现[TryFromPacket]和[TryIntoPacket]特质,要么需要从skrillax_serdecrate实现/推导skrillax_serde::Serializeskrillax_serde::Deserializeskrillax_serde::ByteSize。有了这些,[TryIntoPacket]和[TryFromPacket]将自动为您实现。这对于将包内容序列化/反序列化为字节并使用帧发送是必要的。

推导

当前推导宏有三个选项,用于所有提供的特质

#[derive(Packet)]
#[packet(opcode = 0x5001, encrypted = true, massive = false)]
struct MyPacket {
    content: String,
}

encryptedmassive默认为false,且互斥。 opcode是必需的属性,这也可以视为包的ID。名称默认视为结构的名称。

依赖项

~1.2–2.1MB
~43K SLoC