fix binding issues
This commit is contained in:
@@ -906,7 +906,7 @@ impl NetworkManager {
|
||||
return Ok(NetworkResult::timeout());
|
||||
}
|
||||
ReceiptEvent::Cancelled => {
|
||||
bail!("reverse connect receipt cancelled from {:?}", target_nr);
|
||||
return Ok(NetworkResult::no_connection_other(format!("reverse connect receipt cancelled from {}", target_nr)))
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -115,6 +115,15 @@ impl Network {
|
||||
// tcp_stream.peer_addr().unwrap(),
|
||||
// );
|
||||
|
||||
if let Err(e) = tcp_stream.set_linger(Some(core::time::Duration::from_secs(0))) {
|
||||
log_net!(debug "Couldn't set TCP linger: {}", e);
|
||||
return;
|
||||
}
|
||||
if let Err(e) = tcp_stream.set_nodelay(true) {
|
||||
log_net!(debug "Couldn't set TCP nodelay: {}", e);
|
||||
return;
|
||||
}
|
||||
|
||||
let listener_state = listener_state.clone();
|
||||
let connection_manager = connection_manager.clone();
|
||||
|
||||
|
@@ -33,7 +33,7 @@ cfg_if! {
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", ret, err)]
|
||||
#[instrument(level = "trace", ret)]
|
||||
pub fn new_unbound_shared_udp_socket(domain: Domain) -> io::Result<Socket> {
|
||||
let socket = Socket::new(domain, Type::DGRAM, Some(Protocol::UDP))?;
|
||||
if domain == Domain::IPV6 {
|
||||
@@ -49,7 +49,7 @@ pub fn new_unbound_shared_udp_socket(domain: Domain) -> io::Result<Socket> {
|
||||
Ok(socket)
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", ret, err)]
|
||||
#[instrument(level = "trace", ret)]
|
||||
pub fn new_bound_shared_udp_socket(local_address: SocketAddr) -> io::Result<Socket> {
|
||||
let domain = Domain::for_address(local_address);
|
||||
let socket = new_unbound_shared_udp_socket(domain)?;
|
||||
@@ -61,7 +61,7 @@ pub fn new_bound_shared_udp_socket(local_address: SocketAddr) -> io::Result<Sock
|
||||
Ok(socket)
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", ret, err)]
|
||||
#[instrument(level = "trace", ret)]
|
||||
pub fn new_bound_first_udp_socket(local_address: SocketAddr) -> io::Result<Socket> {
|
||||
let domain = Domain::for_address(local_address);
|
||||
let socket = Socket::new(domain, Type::DGRAM, Some(Protocol::UDP))?;
|
||||
@@ -95,7 +95,7 @@ pub fn new_bound_first_udp_socket(local_address: SocketAddr) -> io::Result<Socke
|
||||
Ok(socket)
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", ret, err)]
|
||||
#[instrument(level = "trace", ret)]
|
||||
pub fn new_unbound_shared_tcp_socket(domain: Domain) -> io::Result<Socket> {
|
||||
let socket = Socket::new(domain, Type::STREAM, Some(Protocol::TCP))?;
|
||||
if let Err(e) = socket.set_linger(Some(core::time::Duration::from_secs(0))) {
|
||||
@@ -117,7 +117,7 @@ pub fn new_unbound_shared_tcp_socket(domain: Domain) -> io::Result<Socket> {
|
||||
Ok(socket)
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", ret, err)]
|
||||
#[instrument(level = "trace", ret)]
|
||||
pub fn new_bound_shared_tcp_socket(local_address: SocketAddr) -> io::Result<Socket> {
|
||||
let domain = Domain::for_address(local_address);
|
||||
let socket = new_unbound_shared_tcp_socket(domain)?;
|
||||
@@ -129,7 +129,7 @@ pub fn new_bound_shared_tcp_socket(local_address: SocketAddr) -> io::Result<Sock
|
||||
Ok(socket)
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", ret, err)]
|
||||
#[instrument(level = "trace", ret)]
|
||||
pub fn new_bound_first_tcp_socket(local_address: SocketAddr) -> io::Result<Socket> {
|
||||
let domain = Domain::for_address(local_address);
|
||||
|
||||
|
@@ -243,7 +243,24 @@ impl Network {
|
||||
bail!("No valid listen address: {}", listen_address);
|
||||
}
|
||||
let port = sockaddrs[0].port();
|
||||
if !self.bind_first_tcp_port(port) {
|
||||
|
||||
let mut attempts = 10;
|
||||
let mut success = false;
|
||||
while attempts >= 0 {
|
||||
if self.bind_first_tcp_port(port) {
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
attempts -= 1;
|
||||
|
||||
// Wait 5 seconds before trying again
|
||||
log_net!(debug
|
||||
"Binding TCP port at {} failed, waiting. Attempts remaining = {}",
|
||||
port, attempts
|
||||
);
|
||||
sleep(5000).await
|
||||
}
|
||||
if !success {
|
||||
bail!("Could not find free tcp port to listen on");
|
||||
}
|
||||
Ok((port, sockaddrs.iter().map(|s| s.ip()).collect()))
|
||||
|
Reference in New Issue
Block a user