pub struct SyncDevice(/* private fields */);Expand description
A transparent wrapper around DeviceImpl, providing synchronous I/O operations.
§Examples
Basic read/write operation:
use std::net::Ipv4Addr;
use tun_rs::DeviceBuilder;
fn main() -> std::io::Result<()> {
// Create a TUN device using the builder
let mut tun = DeviceBuilder::new()
.name("my-tun")
.ipv4(Ipv4Addr::new(10, 0, 0, 1), 24, None)
.build_sync()?;
// Send a packet
// Example IP packet (Replace with real IP message)
let packet = b"[IP Packet: 10.0.0.1 -> 10.0.0.2] Hello, TUN!";
tun.send(packet)?;
println!("Sent {} bytes IP packet", packet.len());
// Receive a packet
let mut buf = [0u8; 1500];
let n = tun.recv(&mut buf)?;
println!("Received {} bytes: {:?}", n, &buf[..n]);
Ok(())
}Implementations§
Source§impl SyncDevice
impl SyncDevice
Sourcepub unsafe fn from_fd(fd: RawFd) -> Result<Self>
Available on Unix only.
pub unsafe fn from_fd(fd: RawFd) -> Result<Self>
Creates a new SyncDevice from a raw file descriptor.
§Safety
- The file descriptor (
fd) must be an owned file descriptor. - It must be valid and open.
This function is only available on Unix platforms.
Sourcepub fn recv(&self, buf: &mut [u8]) -> Result<usize>
pub fn recv(&self, buf: &mut [u8]) -> Result<usize>
Receives data from the device into the provided buffer.
Returns the number of bytes read, or an I/O error.
§Example
use std::net::Ipv4Addr;
use tun_rs::DeviceBuilder;
let mut tun = DeviceBuilder::new()
.name("my-tun")
.ipv4(Ipv4Addr::new(10, 0, 0, 1), 24, None)
.build_sync()
.unwrap();
let mut buf = [0u8; 1500];
tun.recv(&mut buf).unwrap();§Note
Blocking the current thread if no packet is available
Sourcepub fn send(&self, buf: &[u8]) -> Result<usize>
pub fn send(&self, buf: &[u8]) -> Result<usize>
Sends data from the provided buffer to the device.
Returns the number of bytes written, or an I/O error.
§Example
use std::net::Ipv4Addr;
use tun_rs::DeviceBuilder;
let mut tun = DeviceBuilder::new()
.name("my-tun")
.ipv4(Ipv4Addr::new(10, 0, 0, 1), 24, None)
.build_sync()
.unwrap();
tun.send(b"hello").unwrap();pub fn shutdown(&self) -> Result<()>
experimental only.Sourcepub fn recv_intr(&self, buf: &mut [u8], event: &InterruptEvent) -> Result<usize>
Available on crate feature interruptible only.
pub fn recv_intr(&self, buf: &mut [u8], event: &InterruptEvent) -> Result<usize>
interruptible only.Reads data into the provided buffer, with support for interruption.
This function attempts to read from the underlying file descriptor into buf,
and can be interrupted using the given InterruptEvent. If the event is triggered
while the read operation is blocked, the function will return early with
an error of kind std::io::ErrorKind::Interrupted.
§Arguments
buf- The buffer to store the read data.event- AnInterruptEventused to interrupt the blocking read.
§Returns
On success, returns the number of bytes read. On failure, returns an std::io::Error.
§Platform-specific Behavior
On Unix platforms, it is recommended to use this together with set_nonblocking(true).
Without setting non-blocking mode, concurrent reads may not respond properly to interrupt signals.
§Feature
This method is only available when the interruptible feature is enabled.
pub fn recv_intr_timeout( &self, buf: &mut [u8], event: &InterruptEvent, timeout: Option<Duration>, ) -> Result<usize>
interruptible only.Sourcepub fn recv_vectored_intr(
&self,
bufs: &mut [IoSliceMut<'_>],
event: &InterruptEvent,
) -> Result<usize>
Available on Unix and crate feature interruptible only.
pub fn recv_vectored_intr( &self, bufs: &mut [IoSliceMut<'_>], event: &InterruptEvent, ) -> Result<usize>
interruptible only.pub fn recv_vectored_intr_timeout( &self, bufs: &mut [IoSliceMut<'_>], event: &InterruptEvent, timeout: Option<Duration>, ) -> Result<usize>
interruptible only.pub fn wait_readable_intr(&self, event: &InterruptEvent) -> Result<()>
interruptible only.pub fn wait_readable_intr_timeout( &self, event: &InterruptEvent, timeout: Option<Duration>, ) -> Result<()>
interruptible only.pub fn send_intr(&self, buf: &[u8], event: &InterruptEvent) -> Result<usize>
interruptible only.pub fn send_vectored_intr( &self, bufs: &[IoSlice<'_>], event: &InterruptEvent, ) -> Result<usize>
interruptible only.pub fn wait_writable_intr(&self, event: &InterruptEvent) -> Result<()>
interruptible only.Sourcepub fn recv_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
Available on Unix only.
pub fn recv_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
Receives data from the device into multiple buffers using vectored I/O.
Note: This method operates on a single packet only. It will only read data from one packet, even if multiple buffers are provided.
Returns the total number of bytes read from the packet, or an error.
Sourcepub fn send_vectored(&self, bufs: &[IoSlice<'_>]) -> Result<usize>
Available on Unix only.
pub fn send_vectored(&self, bufs: &[IoSlice<'_>]) -> Result<usize>
Sends data to the device from multiple buffers using vectored I/O.
Note: This method operates on a single packet only. It will only send the data contained in the provided buffers as one packet.
Returns the total number of bytes written for the packet, or an error.
Sourcepub fn is_nonblocking(&self) -> Result<bool>
Available on Unix only.
pub fn is_nonblocking(&self) -> Result<bool>
Checks whether the device is currently operating in nonblocking mode.
Returns true if nonblocking mode is enabled, false otherwise, or an error.
Sourcepub fn set_nonblocking(&self, nonblocking: bool) -> Result<()>
Available on Unix only.
pub fn set_nonblocking(&self, nonblocking: bool) -> Result<()>
Sets the nonblocking mode for the device.
nonblocking: Passtrueto enable nonblocking mode,falseto disable.
Returns an empty result on success or an I/O error.
Trait Implementations§
Source§impl AsFd for SyncDevice
Available on Unix only.
impl AsFd for SyncDevice
Source§fn as_fd(&self) -> BorrowedFd<'_>
fn as_fd(&self) -> BorrowedFd<'_>
Source§impl AsRawFd for SyncDevice
Available on Unix only.
impl AsRawFd for SyncDevice
Source§impl Deref for SyncDevice
impl Deref for SyncDevice
Source§impl FromRawFd for SyncDevice
Available on Unix only.
impl FromRawFd for SyncDevice
Source§unsafe fn from_raw_fd(fd: RawFd) -> Self
unsafe fn from_raw_fd(fd: RawFd) -> Self
Self from the given raw file
descriptor. Read more