#![allow(unsafe_code)]
use std::io;
#[inline]
pub fn enable_tcp_nodelay(stream: &compio::net::TcpStream) -> io::Result<()> {
#[cfg(unix)]
{
use std::os::unix::io::{AsRawFd, 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)]
{
use std::os::windows::io::{AsRawSocket, 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)))]
{
Ok(())
}
}
pub fn configure_tcp_keepalive(
stream: &compio::net::TcpStream,
keepalive: i32,
keepalive_cnt: i32,
keepalive_idle: i32,
keepalive_intvl: i32,
) -> io::Result<()> {
#[cfg(unix)]
{
use std::os::unix::io::{AsRawFd, 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)]
{
use std::os::windows::io::{AsRawSocket, 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)))]
{
let _ = (keepalive, keepalive_cnt, keepalive_idle, keepalive_intvl);
Ok(())
}
}