class @beta Efl.Net.Socket_Simple extends Efl.Io.Buffered_Stream implements Efl.Net.Socket { [[A wrapper socket offering an easy to use, buffered I/O. The simple socket encapsulates an actual @Efl.Net.Socket and uses it with an @Efl.Io.Buffered_Stream, which creates an input @Efl.Io.Queue and an output @Efl.Io.Queue. These are linked using a receiver and a sender @Efl.Io.Copier. The idea is that unlike the traditional @Efl.Net.Socket which attempts to write directly to socket and thus may take less data than requested, this one will keep the pending data in its own buffer, feeding to the actual socket when @Efl.Io.Writer.can_write. This makes its operation much simpler as @Efl.Io.Writer.write will always take the full data -- allows "write and forget", if unlimited (see @Efl.Io.Buffered_Stream.max_queue_size_output). Reading is also much simpler since received data is kept in an @Efl.Io.Queue, thus its size can be queried with @Efl.Io.Buffered_Stream.pending_read and read with @Efl.Io.Reader.read or peeked with @Efl.Io.Buffered_Stream.slice, then discarded with @Efl.Io.Buffered_Stream.discard or @Efl.Io.Buffered_Stream.clear. When waiting for a complete message, you can just peek at its contents: if incomplete do nothing, if complete then use either @Efl.Io.Reader.read to get a copy or manipulate a read-only reference from @Efl.Io.Buffered_Stream.slice and then @Efl.Io.Buffered_Stream.discard The actual socket is set with the constructor method @Efl.Io.Buffered_Stream.inner_io.set and can be retrieved with @Efl.Io.Buffered_Stream.inner_io.get, which should be used with care. ]] implements { Efl.Io.Buffered_Stream.inner_io { set; } Efl.Net.Socket.address_local { get; } Efl.Net.Socket.address_remote { get; } } }