summaryrefslogtreecommitdiff
path: root/ext/net/ops_tls.rs
diff options
context:
space:
mode:
authorGianluca Oldani <oldanigianluca@gmail.com>2022-03-05 00:43:48 +0100
committerGitHub <noreply@github.com>2022-03-05 00:43:48 +0100
commit7e3496403a3d4718ead14e8c5422e9c70fc2129b (patch)
treef370e644011ce5eaa03f42a8718350c09b761877 /ext/net/ops_tls.rs
parent70690f54af945a3ca94235c060de4bdee5c61d09 (diff)
feat(ext/net): Use socket2 crate to create TcpListener (#13808)
Diffstat (limited to 'ext/net/ops_tls.rs')
-rw-r--r--ext/net/ops_tls.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/ext/net/ops_tls.rs b/ext/net/ops_tls.rs
index 7fce34820..01f29b2ad 100644
--- a/ext/net/ops_tls.rs
+++ b/ext/net/ops_tls.rs
@@ -54,6 +54,9 @@ use io::Error;
use io::Read;
use io::Write;
use serde::Deserialize;
+use socket2::Domain;
+use socket2::Socket;
+use socket2::Type;
use std::borrow::Cow;
use std::cell::RefCell;
use std::convert::From;
@@ -1075,8 +1078,19 @@ where
let bind_addr = resolve_addr_sync(hostname, port)?
.next()
.ok_or_else(|| generic_error("No resolved address found"))?;
- let std_listener = std::net::TcpListener::bind(bind_addr)?;
- std_listener.set_nonblocking(true)?;
+ let domain = if bind_addr.is_ipv4() {
+ Domain::IPV4
+ } else {
+ Domain::IPV6
+ };
+ let socket = Socket::new(domain, Type::STREAM, None)?;
+ #[cfg(not(windows))]
+ socket.set_reuse_address(true)?;
+ let socket_addr = socket2::SockAddr::from(bind_addr);
+ socket.bind(&socket_addr)?;
+ socket.listen(128)?;
+ socket.set_nonblocking(true)?;
+ let std_listener: std::net::TcpListener = socket.into();
let tcp_listener = TcpListener::from_std(std_listener)?;
let local_addr = tcp_listener.local_addr()?;