Function nc::setsockopt
source · pub unsafe fn setsockopt(
sockfd: i32,
level: i32,
optname: i32,
optval: usize,
optlen: socklen_t
) -> Result<(), Errno>
Expand description
Set options on sockets.
§Example
let socket_fd = unsafe { nc::socket(nc::AF_INET, nc::SOCK_STREAM, 0) };
assert!(socket_fd.is_ok());
let socket_fd = socket_fd.unwrap();
// Enable tcp fast open.
let queue_len: i32 = 5;
let queue_len_ptr = &queue_len as *const i32 as usize;
let ret = unsafe {
nc::setsockopt(
socket_fd,
nc::IPPROTO_TCP,
nc::TCP_FASTOPEN,
queue_len_ptr,
std::mem::size_of_val(&queue_len) as u32,
)
};
assert!(ret.is_ok());
let ret = unsafe { nc::close(socket_fd) };
assert!(ret.is_ok());
Examples found in repository?
examples/bind_device.rs (lines 9-15)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() -> Result<(), nc::Errno> {
let socket_fd = unsafe { nc::socket(nc::AF_INET, nc::SOCK_STREAM, 0)? };
let interface_name = "lo";
let ret = unsafe {
nc::setsockopt(
socket_fd,
nc::SOL_SOCKET,
nc::SO_BINDTODEVICE,
interface_name.as_ptr() as usize,
interface_name.len() as nc::socklen_t,
)
};
match ret {
Err(errno) => eprintln!("socket() err: {}", nc::strerror(errno)),
Ok(_) => println!("Now socket is bind to {}", interface_name),
}
let ret = unsafe { nc::close(socket_fd) };
assert!(ret.is_ok());
Ok(())
}
More examples
examples/tcp_fast_open.rs (lines 18-24)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
fn main() -> Result<(), nc::Errno> {
let socket_fd = unsafe { nc::socket(nc::AF_INET, nc::SOCK_STREAM, 0)? };
// For Linux, value is the queue length of pending packets.
// See https://github.com/rust-lang/socket2/issues/49
#[cfg(any(target_os = "linux", target_os = "android"))]
let queue_len: i32 = 5;
// For the others, just a boolean value for enable and disable.
#[cfg(target_os = "freebsd")]
let queue_len: i32 = 1;
let queue_len_ptr = &queue_len as *const i32 as usize;
let ret = unsafe {
nc::setsockopt(
socket_fd,
nc::IPPROTO_TCP,
nc::TCP_FASTOPEN,
queue_len_ptr,
std::mem::size_of_val(&queue_len) as u32,
)
};
assert!(ret.is_ok());
unsafe { nc::close(socket_fd) }
}