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, SessionType},
32    peer_registry::PeerRegistry,
33    peer_store::Score,
34    protocols::{
35        BoxedCKBProtocolContext, CKBProtocol, CKBProtocolContext, CKBProtocolHandler, PeerIndex,
36        identify::Flags, support_protocols::SupportProtocols,
37    },
38};
39pub use p2p::{
40    ProtocolId, SessionId, async_trait,
41    builder::ServiceBuilder,
42    bytes, multiaddr, runtime,
43    secio::{self, PeerId, PublicKey},
44    service::{ServiceControl, SessionType as RawSessionType, TargetProtocol, TargetSession},
45    traits::ServiceProtocol,
46    utils::{extract_peer_id, multiaddr_to_socketaddr},
47};
48pub use tokio;
49
50/// Protocol version used by network protocol open
51pub type ProtocolVersion = String;
52
53/// Observe listen port occupancy
54pub async fn observe_listen_port_occupancy(
55    _addrs: &[multiaddr::MultiAddr],
56) -> Result<(), std::io::Error> {
57    #[cfg(target_os = "linux")]
58    {
59        use p2p::utils::dns::DnsResolver;
60        use std::net::{SocketAddr, TcpListener};
61
62        for raw_addr in _addrs {
63            let ip_addr: Option<SocketAddr> = match DnsResolver::new(raw_addr.clone()) {
64                Some(dns) => dns.await.ok().as_ref().and_then(multiaddr_to_socketaddr),
65                None => multiaddr_to_socketaddr(raw_addr),
66            };
67
68            if let Some(addr) = ip_addr {
69                if let Err(e) = TcpListener::bind(addr) {
70                    ckb_logger::error!(
71                        "addr {} can't use on your machines by error: {}, please check",
72                        raw_addr,
73                        e
74                    );
75                    return Err(e);
76                }
77            }
78        }
79    }
80
81    Ok(())
82}