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