cs_mwc_bch/messages/
addr.rs1use messages::message::Payload;
2use messages::node_addr_ex::NodeAddrEx;
3use std::fmt;
4use std::io;
5use std::io::{Read, Write};
6use util::{var_int, Error, Result, Serializable};
7
8const MAX_ADDR_COUNT: u64 = 1000;
10
11#[derive(Default, PartialEq, Eq, Hash, Clone)]
13pub struct Addr {
14 pub addrs: Vec<NodeAddrEx>,
16}
17
18impl Serializable<Addr> for Addr {
19 fn read(reader: &mut dyn Read) -> Result<Addr> {
20 let mut ret = Addr { addrs: Vec::new() };
21 let count = var_int::read(reader)?;
22 if count > MAX_ADDR_COUNT {
23 let msg = format!("Too many addrs: {}", count);
24 return Err(Error::BadData(msg));
25 }
26 for _i in 0..count {
27 ret.addrs.push(NodeAddrEx::read(reader)?);
28 }
29 Ok(ret)
30 }
31
32 fn write(&self, writer: &mut dyn Write) -> io::Result<()> {
33 var_int::write(self.addrs.len() as u64, writer)?;
34 for item in self.addrs.iter() {
35 item.write(writer)?;
36 }
37 Ok(())
38 }
39}
40
41impl Payload<Addr> for Addr {
42 fn size(&self) -> usize {
43 var_int::size(self.addrs.len() as u64) + self.addrs.len() * NodeAddrEx::SIZE
44 }
45}
46
47impl fmt::Debug for Addr {
48 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
49 if self.addrs.len() <= 3 {
50 f.debug_struct("Addr").field("addrs", &self.addrs).finish()
51 } else {
52 let s = format!("[<{} addrs>]", self.addrs.len());
53 f.debug_struct("Addr").field("addrs", &s).finish()
54 }
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61 use hex;
62 use messages::NodeAddr;
63 use std::io::Cursor;
64 use std::net::Ipv6Addr;
65
66 #[test]
67 fn read_bytes() {
68 let b = hex::decode(
69 "013c93dd5a250000000000000000000000000000000000ffff43cdb3a1479d".as_bytes(),
70 ).unwrap();
71 let a = Addr::read(&mut Cursor::new(&b)).unwrap();
72 assert!(a.addrs.len() == 1);
73 assert!(a.addrs[0].last_connected_time == 1524470588);
74 assert!(a.addrs[0].addr.services == 37);
75 let ip = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 67, 205, 179, 161];
76 assert!(a.addrs[0].addr.ip.octets() == ip);
77 assert!(a.addrs[0].addr.port == 18333);
78 }
79
80 #[test]
81 fn write_read() {
82 let mut v = Vec::new();
83 let addr1 = NodeAddrEx {
84 last_connected_time: 100,
85 addr: NodeAddr {
86 services: 900,
87 ip: Ipv6Addr::from([1; 16]),
88 port: 2000,
89 },
90 };
91 let addr2 = NodeAddrEx {
92 last_connected_time: 200,
93 addr: NodeAddr {
94 services: 800,
95 ip: Ipv6Addr::from([2; 16]),
96 port: 3000,
97 },
98 };
99 let addr3 = NodeAddrEx {
100 last_connected_time: 700,
101 addr: NodeAddr {
102 services: 900,
103 ip: Ipv6Addr::from([3; 16]),
104 port: 4000,
105 },
106 };
107 let f = Addr {
108 addrs: vec![addr1, addr2, addr3],
109 };
110 f.write(&mut v).unwrap();
111 assert!(v.len() == f.size());
112 assert!(Addr::read(&mut Cursor::new(&v)).unwrap() == f);
113 }
114}