summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/flash/01_http.js1
-rw-r--r--ext/flash/Cargo.toml1
-rw-r--r--ext/flash/lib.rs37
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;