chain_p2p/p2p/
message.rs

1
2#[derive(Debug)]
3/**
4 * 自定义信息结构,信息 0x55 之后信息的长度
5 */
6pub struct Message {
7    start: u8, 
8    len: [u8;4],
9    cmd: u8,
10    reserved: u8,
11    data: Vec<u8>, // 不设长度
12    end: u8,
13}
14impl Message {
15    pub fn close_msg() -> Vec<u8> {
16        vec![85u8, 6, 0, 0, 0, 0, 0, 122]
17    }
18    pub fn new(cmd: &mut Vec<u8>, data: Vec<u8>) -> Result<Message, &'static str> {
19        // 对 data长度也需要判断,是否大于4字节可表示的最大范围
20        if cmd.len() == 1 {
21            let len = 1+1+data.len()+1;
22            let len = Message::data_len(len);
23            Ok(Message {
24                start: 0x55,
25                len: len,
26                cmd: cmd.pop().unwrap(),
27                reserved: 0u8,
28                data: data,
29                end: 0x7A,
30            })
31        } else if cmd.len() == 2 {
32            let len = 1+1+data.len()+1;
33            let len = Message::data_len(len);
34            Ok(Message {
35                start: 0x55,
36                len: len,
37                cmd: cmd.pop().unwrap(),
38                reserved: cmd.pop().unwrap(),
39                data: data,
40                end: 0x7A,
41            })
42        } else {
43            Err("cmd is wrong")
44        }
45    }
46    fn data_len(len: usize) -> [u8;4] {
47        let b1 : u8 = ((len >> 24) & 0xff) as u8;
48        let b2 : u8 = ((len >> 16) & 0xff) as u8;
49        let b3 : u8 = ((len >> 8) & 0xff) as u8;
50        let b4 : u8 = (len & 0xff) as u8;
51        return [b4, b3, b2, b1]
52    }
53    pub fn to_vec(&mut self) -> Vec<u8> {
54        let mut vec = Vec::new();
55        vec.push(self.start);
56        for i in 0..4 {
57            vec.push(self.len[i]);
58        }
59        vec.push(self.cmd);
60        vec.push(self.reserved);
61        let len = self.data.len();
62        for _i in 0..len {
63            vec.push(self.data.pop().unwrap());
64        }
65        vec.push(self.end);
66        vec
67    }
68}
69pub trait MsgHandler {
70    fn decode(&self, recv: &mut Vec<u8>) -> Result<Vec<u8>, &'static str>;
71    fn encode(&self, cmd: &mut Vec<u8>, data: Vec<u8>) -> Result<Message, &'static str>;
72}