Skip to main content

SimTcpStream

Struct SimTcpStream 

Source
pub struct SimTcpStream { /* private fields */ }
Expand description

Simulated TCP stream that implements async read/write operations.

SimTcpStream provides a realistic simulation of TCP socket behavior by implementing the AsyncRead and AsyncWrite traits. It interfaces with the simulation event system to provide ordered, reliable data delivery with configurable network delays.

§Architecture Overview

Each SimTcpStream represents one endpoint of a TCP connection:

Application Layer          SimTcpStream Layer          Simulation Layer
─────────────────          ──────────────────          ─────────────────
                                                        
stream.write_all(data) ──► poll_write(data) ────────► buffer_send(data)
                                                       └─► ProcessSendBuffer event
                                                           └─► DataDelivery event
                                                               └─► paired connection
                                                        
stream.read(buf) ◄────── poll_read(buf) ◄──────────── receive_buffer
                         │                           └─► waker registration
                         └─► Poll::Pending/Ready     

§TCP Semantics Implemented

This implementation provides the core TCP guarantees required for realistic simulation:

§1. Reliable Delivery

  • All written data will eventually be delivered to the paired connection
  • No data loss (unless explicitly simulated via fault injection)
  • Delivery confirmation through the event system

§2. Ordered Delivery (FIFO)

  • Messages written first will arrive first at the destination
  • Achieved through per-connection send buffering
  • Critical for protocols that depend on message ordering

§3. Flow Control Simulation

  • Read operations block (Poll::Pending) when no data is available
  • Write operations complete immediately (buffering model)
  • Backpressure handled at the application layer

§Usage Examples

Provides async read/write operations for client and server connections.

§Performance Characteristics

  • Write Latency: O(1) - writes are buffered immediately
  • Read Latency: O(network_delay) - depends on simulation configuration
  • Memory Usage: O(buffered_data) - proportional to unread data
  • CPU Overhead: Minimal - leverages efficient event system

§Connection Lifecycle

  1. Creation: Stream created with reference to simulation and connection ID
  2. Active Phase: Read/write operations interact with simulation buffers
  3. Data Transfer: Asynchronous event processing handles network simulation
  4. Termination: Stream dropped when connection ends (automatic cleanup)

§Thread Safety

SimTcpStream is Send + Sync + Unpin + 'static via its Arc<RwLock<…>> backed WeakSimWorld handle. The simulation runtime itself runs on a single OS thread (new_current_thread().build()), but the stream type satisfies Send-bounded traits so it composes naturally with tokio::spawn, hyper/reqwest connectors, and customer code that uses Arc<RwLock<…>> / DashMap / Arc<AtomicBool>.

Implementations§

Source§

impl SimTcpStream

Source

pub fn connection_id(&self) -> ConnectionId

Get the connection ID (for test introspection and chaos injection)

Source

pub fn is_write_vectored(&self) -> bool

Returns true: SimTcpStream implements an efficient vectored write that records each IoSlice as its own ordered delivery event, so the chaos pack can act on individual segments.

Trait Implementations§

Source§

impl AsyncRead for SimTcpStream

Source§

fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll<Result<usize>>

Attempt to read from the AsyncRead into buf. Read more
Source§

fn poll_read_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>], ) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into bufs using vectored IO operations. Read more
Source§

impl AsyncWrite for SimTcpStream

Source§

fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll<Result<usize, Error>>

Attempt to write bytes from buf into the object. Read more
Source§

fn poll_write_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>], ) -> Poll<Result<usize, Error>>

Attempt to write bytes from bufs into the object using vectored IO operations. Read more
Source§

fn poll_flush( self: Pin<&mut Self>, _cx: &mut Context<'_>, ) -> Poll<Result<(), Error>>

Attempt to flush the object, ensuring that any buffered data reach their destination. Read more
Source§

fn poll_close( self: Pin<&mut Self>, _cx: &mut Context<'_>, ) -> Poll<Result<(), Error>>

Attempt to close the object. Read more
Source§

impl Drop for SimTcpStream

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<R> AsyncReadExt for R
where R: AsyncRead + ?Sized,

Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where Self: Sized, R: AsyncRead,

Creates an adaptor which will chain this stream with another. Read more
Source§

fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>
where Self: Unpin,

Tries to read some bytes directly into the given buf in asynchronous manner, returning a future type. Read more
Source§

fn read_vectored<'a>( &'a mut self, bufs: &'a mut [IoSliceMut<'a>], ) -> ReadVectored<'a, Self>
where Self: Unpin,

Creates a future which will read from the AsyncRead into bufs using vectored IO operations. Read more
Source§

fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>
where Self: Unpin,

Creates a future which will read exactly enough bytes to fill buf, returning an error if end of file (EOF) is hit sooner. Read more
Source§

fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>
where Self: Unpin,

Creates a future which will read all the bytes from this AsyncRead. Read more
Source§

fn read_to_string<'a>( &'a mut self, buf: &'a mut String, ) -> ReadToString<'a, Self>
where Self: Unpin,

Creates a future which will read all the bytes from this AsyncRead. Read more
Source§

fn split(self) -> (ReadHalf<Self>, WriteHalf<Self>)
where Self: Sized + AsyncWrite,

Helper method for splitting this read/write object into two halves. Read more
Source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an AsyncRead adapter which will read at most limit bytes from the underlying reader. Read more
Source§

impl<W> AsyncWriteExt for W
where W: AsyncWrite + ?Sized,

Source§

fn flush(&mut self) -> Flush<'_, Self>
where Self: Unpin,

Creates a future which will entirely flush this AsyncWrite. Read more
Source§

fn close(&mut self) -> Close<'_, Self>
where Self: Unpin,

Creates a future which will entirely close this AsyncWrite.
Source§

fn write<'a>(&'a mut self, buf: &'a [u8]) -> Write<'a, Self>
where Self: Unpin,

Creates a future which will write bytes from buf into the object. Read more
Source§

fn write_vectored<'a>( &'a mut self, bufs: &'a [IoSlice<'a>], ) -> WriteVectored<'a, Self>
where Self: Unpin,

Creates a future which will write bytes from bufs into the object using vectored IO operations. Read more
Source§

fn write_all<'a>(&'a mut self, buf: &'a [u8]) -> WriteAll<'a, Self>
where Self: Unpin,

Write data into this object. Read more
Source§

fn into_sink<Item>(self) -> IntoSink<Self, Item>
where Item: AsRef<[u8]>, Self: Sized,

Allow using an AsyncWrite as a Sink<Item: AsRef<[u8]>>. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FuturesAsyncReadCompatExt for T
where T: AsyncRead,

Source§

fn compat(self) -> Compat<Self>
where Self: Sized,

Wraps self with a compatibility layer that implements tokio_io::AsyncRead.
Source§

impl<T> FuturesAsyncWriteCompatExt for T
where T: AsyncWrite,

Source§

fn compat_write(self) -> Compat<Self>
where Self: Sized,

Wraps self with a compatibility layer that implements tokio::io::AsyncWrite.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more