#![allow(unsafe_code)]
use std::io;
#[cfg(unix)]
#[inline]
pub fn enable_tcp_nodelay<S: std::os::unix::io::AsRawFd>(stream: &S) -> io::Result<()> {
use std::os::unix::io::FromRawFd;
let fd = stream.as_raw_fd();
let sock = unsafe { socket2::Socket::from_raw_fd(fd) };
sock.set_nodelay(true)?;
std::mem::forget(sock); Ok(())
}
#[cfg(windows)]
#[inline]
pub fn enable_tcp_nodelay<S: std::os::windows::io::AsRawSocket>(stream: &S) -> io::Result<()> {
use std::os::windows::io::FromRawSocket;
let raw = stream.as_raw_socket();
let sock = unsafe { socket2::Socket::from_raw_socket(raw) };
sock.set_nodelay(true)?;
std::mem::forget(sock); Ok(())
}
#[cfg(not(any(unix, windows)))]
#[inline]
pub fn enable_tcp_nodelay<S>(_stream: &S) -> io::Result<()> {
Ok(())
}
#[cfg(unix)]
pub fn configure_tcp_keepalive<S: std::os::unix::io::AsRawFd>(
stream: &S,
keepalive: i32,
keepalive_cnt: i32,
keepalive_idle: i32,
keepalive_intvl: i32,
) -> io::Result<()> {
{
use std::os::unix::io::FromRawFd;
use std::time::Duration;
let fd = stream.as_raw_fd();
let sock = unsafe { socket2::Socket::from_raw_fd(fd) };
if keepalive >= 0 {
sock.set_keepalive(keepalive != 0)?;
}
if keepalive == 1 {
let mut params = socket2::TcpKeepalive::new();
if keepalive_idle > 0 {
params = params.with_time(Duration::from_secs(keepalive_idle as u64));
}
#[cfg(not(target_os = "openbsd"))]
if keepalive_intvl > 0 {
params = params.with_interval(Duration::from_secs(keepalive_intvl as u64));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
if keepalive_cnt > 0 {
params = params.with_retries(keepalive_cnt as u32);
}
sock.set_tcp_keepalive(¶ms)?;
}
std::mem::forget(sock); Ok(())
}
}
#[cfg(windows)]
pub fn configure_tcp_keepalive<S: std::os::windows::io::AsRawSocket>(
stream: &S,
keepalive: i32,
keepalive_cnt: i32,
keepalive_idle: i32,
keepalive_intvl: i32,
) -> io::Result<()> {
let _ = keepalive_cnt;
use std::os::windows::io::FromRawSocket;
use std::time::Duration;
let raw = stream.as_raw_socket();
let sock = unsafe { socket2::Socket::from_raw_socket(raw) };
if keepalive >= 0 {
sock.set_keepalive(keepalive != 0)?;
}
if keepalive == 1 {
let mut params = socket2::TcpKeepalive::new();
if keepalive_idle > 0 {
params = params.with_time(Duration::from_secs(keepalive_idle as u64));
}
if keepalive_intvl > 0 {
params = params.with_interval(Duration::from_secs(keepalive_intvl as u64));
}
sock.set_tcp_keepalive(¶ms)?;
}
std::mem::forget(sock); Ok(())
}
#[cfg(not(any(unix, windows)))]
pub fn configure_tcp_keepalive<S>(
_stream: &S,
keepalive: i32,
keepalive_cnt: i32,
keepalive_idle: i32,
keepalive_intvl: i32,
) -> io::Result<()> {
let _ = (keepalive, keepalive_cnt, keepalive_idle, keepalive_intvl);
Ok(())
}