diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/flash/01_http.js | 1 | ||||
-rw-r--r-- | ext/flash/Cargo.toml | 1 | ||||
-rw-r--r-- | ext/flash/lib.rs | 37 |
3 files changed, 37 insertions, 2 deletions
diff --git a/ext/flash/01_http.js b/ext/flash/01_http.js index faf740f2e..fcea23a95 100644 --- a/ext/flash/01_http.js +++ b/ext/flash/01_http.js @@ -459,6 +459,7 @@ const listenOpts = { hostname: options.hostname ?? "127.0.0.1", port: options.port ?? 9000, + reuseport: options.reusePort ?? false, }; if (options.cert || options.key) { if (!options.cert || !options.key) { diff --git a/ext/flash/Cargo.toml b/ext/flash/Cargo.toml index 9c8f60cab..45edf38b7 100644 --- a/ext/flash/Cargo.toml +++ b/ext/flash/Cargo.toml @@ -26,4 +26,5 @@ mio = { version = "0.8.1", features = ["os-poll", "net"] } rustls = { version = "0.20" } rustls-pemfile = "1.0" serde = { version = "1.0.136", features = ["derive"] } +socket2 = "0.4.7" tokio = { version = "1.21", features = ["full"] } diff --git a/ext/flash/lib.rs b/ext/flash/lib.rs index 93c95f84b..65d52d083 100644 --- a/ext/flash/lib.rs +++ b/ext/flash/lib.rs @@ -37,6 +37,7 @@ use mio::Poll; use mio::Token; use serde::Deserialize; use serde::Serialize; +use socket2::Socket; use std::cell::RefCell; use std::cell::UnsafeCell; use std::collections::HashMap; @@ -806,6 +807,7 @@ pub struct ListenOpts { key: Option<String>, hostname: String, port: u16, + reuseport: bool, } fn run_server( @@ -815,8 +817,29 @@ fn run_server( addr: SocketAddr, maybe_cert: Option<String>, maybe_key: Option<String>, + reuseport: bool, ) -> Result<(), AnyError> { - let mut listener = TcpListener::bind(addr)?; + let domain = if addr.is_ipv4() { + socket2::Domain::IPV4 + } else { + socket2::Domain::IPV6 + }; + let socket = Socket::new(domain, socket2::Type::STREAM, None)?; + + #[cfg(not(windows))] + socket.set_reuse_address(true)?; + if reuseport { + #[cfg(target_os = "linux")] + socket.set_reuse_port(true)?; + } + + let socket_addr = socket2::SockAddr::from(addr); + socket.bind(&socket_addr)?; + socket.listen(128)?; + socket.set_nonblocking(true)?; + let std_listener: std::net::TcpListener = socket.into(); + let mut listener = TcpListener::from_std(std_listener); + let mut poll = Poll::new()?; let token = Token(0); poll @@ -875,6 +898,7 @@ fn run_server( .registry() .register(&mut socket, token, Interest::READABLE) .unwrap(); + let socket = match tls_context { Some(ref tls_conf) => { let connection = @@ -1156,8 +1180,17 @@ where let tx = ctx.tx.clone(); let maybe_cert = opts.cert; let maybe_key = opts.key; + let reuseport = opts.reuseport; let join_handle = tokio::task::spawn_blocking(move || { - run_server(tx, listening_tx, close_rx, addr, maybe_cert, maybe_key) + run_server( + tx, + listening_tx, + close_rx, + addr, + maybe_cert, + maybe_key, + reuseport, + ) }); let flash_ctx = state.borrow_mut::<FlashContext>(); let server_id = flash_ctx.next_server_id; |