Skip to main content

ntex_server/net/
mod.rs

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