Module socket2

Low-level network socket programming beyond std::net.


socket2 provides direct access to system socket APIs without requiring unsafe code. Where std::net offers high-level TCP/UDP types, socket2 exposes the full range of socket options, address families, and configuration that the OS provides. Common uses include setting socket options like SO_REUSEADDR or TCP_NODELAY, configuring keepalive, creating dual-stack IPv6 listeners, and converting the configured socket into standard library types.

The crate is maintained by the Rust project itself.

Examples

Creating a TCP listener with socket options, then converting to a std::net::TcpListener:

use socket2::{Socket, Domain, Type, Protocol, SockAddr};
use std::net::SocketAddr;

// Create a TCP socket.
let socket = Socket::new(Domain::IPV4, Type::STREAM, Some(Protocol::TCP))?;

// Set SO_REUSEADDR so the port can be reused immediately after close.
socket.set_reuse_address(true)?;

// Bind to a local address.
let address: SocketAddr = "127.0.0.1:0".parse().unwrap();
socket.bind(&SockAddr::from(address))?;

// Start listening.
socket.listen(128)?;

// Convert to a std TcpListener for use with normal APIs.
let listener: std::net::TcpListener = socket.into();
let local_addr = listener.local_addr()?;
assert_eq!(local_addr.ip(), std::net::Ipv4Addr::LOCALHOST);
# Ok::<(), std::io::Error>(())

Structs