Skip to main content

ntex_server/net/
mod.rs

1//! General purpose tcp server
2use std::sync::atomic::{AtomicUsize, Ordering};
3
4use ntex_io::Io;
5use ntex_service::state::State;
6use ntex_util::services::Counter;
7
8mod accept;
9mod builder;
10mod config;
11mod factory;
12mod service;
13mod socket;
14mod state;
15mod test;
16
17pub use self::accept::{AcceptLoop, AcceptNotify, AcceptorCommand};
18pub use self::builder::{ServerBuilder, bind_addr, create_tcp_listener};
19pub use self::config::{ServiceConfig, ServiceRuntime};
20pub use self::service::StreamServer;
21pub use self::socket::{Connection, Stream};
22pub use self::test::{TestServer, TestServerBuilder, build_test_server, test_server};
23
24pub type Server = crate::Server<Connection>;
25
26#[non_exhaustive]
27#[derive(Copy, Clone, Debug, PartialEq, Eq)]
28/// Server readiness status
29pub enum ServerStatus {
30    Ready,
31    NotReady,
32    WorkerFailed,
33}
34
35/// Socket id token
36#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
37pub struct Token(usize);
38
39impl Token {
40    #[must_use]
41    #[allow(clippy::should_implement_trait)]
42    pub fn next(&mut self) -> Token {
43        let token = Token(self.0);
44        self.0 += 1;
45        token
46    }
47}
48
49/// Start server building process
50pub fn build() -> ServerBuilder {
51    ServerBuilder::default()
52}
53
54/// Start server with state building process
55pub fn build_with_state<F, St>(state: F) -> ServerBuilder<St>
56where
57    F: AsyncFn() -> Result<St, &'static str> + Send + Clone + 'static,
58    St: State<St, Io> + Clone + 'static,
59{
60    ServerBuilder::new(state)
61}
62
63static MAX_CONNS: AtomicUsize = AtomicUsize::new(25600);
64
65thread_local! {
66    static MAX_CONNS_COUNTER: Counter = Counter::new(MAX_CONNS.load(Ordering::Relaxed));
67}
68
69/// Sets the maximum per-worker number of concurrent connections.
70///
71/// All socket listeners will stop accepting connections when this limit is
72/// reached for each worker.
73///
74/// By default max connections is set to a 25k per worker.
75pub(super) fn max_concurrent_connections(num: usize) {
76    MAX_CONNS.store(num, Ordering::Relaxed);
77    MAX_CONNS_COUNTER.with(|conns| conns.set_capacity(num));
78}
79
80pub(super) fn num_connections() -> usize {
81    MAX_CONNS_COUNTER.with(Counter::total)
82}