ckb_network/
lib.rs

1//! ckb network module
2//!
3//! This module is based on the Tentacle library, once again abstract the context that protocols can use,
4//! and providing a unified implementation of the peer storage and registration mechanism.
5//!
6//! And implemented several basic protocols: identify, discovery, ping, feeler, disconnect_message
7//!
8
9mod behaviour;
10/// compress module
11pub mod compress;
12pub mod errors;
13pub mod network;
14mod network_group;
15mod peer;
16pub mod peer_registry;
17pub mod peer_store;
18mod protocols;
19mod services;
20
21#[cfg(test)]
22mod tests;
23
24pub use crate::{
25    behaviour::Behaviour,
26    errors::Error,
27    network::{
28        DefaultExitHandler, EventHandler, ExitHandler, NetworkController, NetworkService,
29        NetworkState,
30    },
31    peer::{Peer, PeerIdentifyInfo},
32    peer_registry::PeerRegistry,
33    peer_store::Score,
34    protocols::{
35        identify::Flags, support_protocols::SupportProtocols, BoxedCKBProtocolContext, CKBProtocol,
36        CKBProtocolContext, CKBProtocolHandler, PeerIndex,
37    },
38};
39pub use p2p::{
40    async_trait,
41    builder::ServiceBuilder,
42    bytes, multiaddr, runtime,
43    secio::{self, PeerId, PublicKey},
44    service::{ServiceControl, SessionType, TargetProtocol, TargetSession},
45    traits::ServiceProtocol,
46    utils::{extract_peer_id, multiaddr_to_socketaddr},
47    ProtocolId, SessionId,
48};
49pub use tokio;
50
51/// Protocol version used by network protocol open
52pub type ProtocolVersion = String;
53
54/// Observe listen port occupancy
55pub async fn observe_listen_port_occupancy(
56    _addrs: &[multiaddr::MultiAddr],
57) -> Result<(), std::io::Error> {
58    #[cfg(target_os = "linux")]
59    {
60        use p2p::utils::dns::DnsResolver;
61        use std::net::{SocketAddr, TcpListener};
62
63        for raw_addr in _addrs {
64            let ip_addr: Option<SocketAddr> = match DnsResolver::new(raw_addr.clone()) {
65                Some(dns) => dns.await.ok().as_ref().and_then(multiaddr_to_socketaddr),
66                None => multiaddr_to_socketaddr(raw_addr),
67            };
68
69            if let Some(addr) = ip_addr {
70                if let Err(e) = TcpListener::bind(addr) {
71                    ckb_logger::error!(
72                        "addr {} can't use on your machines by error: {}, please check",
73                        raw_addr,
74                        e
75                    );
76                    return Err(e);
77                }
78            }
79        }
80    }
81
82    Ok(())
83}