Sponge
CS144's user-space TCP library
|
Multithreaded wrapper around TCPConnection that approximates the Unix sockets API. More...
#include <tcp_sponge_socket.hh>
Public Member Functions | |
TCPSpongeSocket (AdaptT &&datagram_interface) | |
Construct from the interface that the TCPConnection thread will use to read and write datagrams. More... | |
~TCPSpongeSocket () | |
When a connected socket is destructed, it will send a RST. More... | |
void | connect (const TCPConfig &c_tcp, const FdAdapterConfig &c_ad) |
Connect using the specified configurations; blocks until connect succeeds or fails. More... | |
void | listen_and_accept (const TCPConfig &c_tcp, const FdAdapterConfig &c_ad) |
Listen and accept using the specified configurations; blocks until accept succeeds or fails. More... | |
void | wait_until_closed () |
This object cannot be safely moved or copied, since it is in use by two threads simultaneously | |
TCPSpongeSocket (const TCPSpongeSocket &)=delete | |
TCPSpongeSocket (TCPSpongeSocket &&)=delete | |
TCPSpongeSocket & | operator= (const TCPSpongeSocket &)=delete |
TCPSpongeSocket & | operator= (TCPSpongeSocket &&)=delete |
Some methods of the parent Socket wouldn't work as expected on the TCP socket, so delete them | |
void | bind (const Address &address)=delete |
Address | local_address () const =delete |
Address | peer_address () const =delete |
void | set_reuseaddr ()=delete |
Public Member Functions inherited from LocalStreamSocket | |
LocalStreamSocket (FileDescriptor &&fd) | |
Construct from a file descriptor. More... | |
Public Member Functions inherited from Socket | |
void | bind (const Address &address) |
Bind a socket to a specified address with bind(2), usually for listen/accept. More... | |
void | connect (const Address &address) |
Connect a socket to a specified peer address with connect(2). More... | |
Address | local_address () const |
Get local address of socket with getsockname(2). More... | |
Address | peer_address () const |
Get peer address of socket with getpeername(2). More... | |
void | set_reuseaddr () |
Allow local address to be reused sooner via SO_REUSEADDR. More... | |
void | shutdown (const int how) |
Shut down a socket via shutdown(2). More... | |
Public Member Functions inherited from FileDescriptor | |
FileDescriptor (const int fd) | |
Construct from a file descriptor number returned by the kernel. More... | |
~FileDescriptor ()=default | |
Free the std::shared_ptr; the FDWrapper destructor calls close() when the refcount goes to zero. More... | |
void | close () |
Close the underlying file descriptor. More... | |
FileDescriptor | duplicate () const |
Copy a FileDescriptor explicitly, increasing the FDWrapper refcount. More... | |
std::string | read (const size_t limit=std::numeric_limits< size_t >::max()) |
Read up to limit bytes. More... | |
void | read (std::string &str, const size_t limit=std::numeric_limits< size_t >::max()) |
Read up to limit bytes into str (caller can allocate storage) More... | |
void | set_blocking (const bool blocking_state) |
Set blocking(true) or non-blocking(false) More... | |
size_t | write (BufferViewList buffer, const bool write_all=true) |
Write a buffer (or list of buffers), possibly blocking until all is written. More... | |
size_t | write (const char *str, const bool write_all=true) |
Write a string, possibly blocking until all is written. More... | |
size_t | write (const std::string &str, const bool write_all=true) |
Write a string, possibly blocking until all is written. More... | |
int | fd_num () const |
underlying descriptor number More... | |
bool | eof () const |
EOF flag state. More... | |
bool | closed () const |
closed flag state More... | |
unsigned int | read_count () const |
number of reads More... | |
unsigned int | write_count () const |
number of writes More... | |
FileDescriptor (const FileDescriptor &other)=delete | |
copy construction is forbidden More... | |
FileDescriptor & | operator= (const FileDescriptor &other)=delete |
copy assignment is forbidden More... | |
FileDescriptor (FileDescriptor &&other)=default | |
move construction is allowed More... | |
FileDescriptor & | operator= (FileDescriptor &&other)=default |
move assignment is allowed More... | |
Private Member Functions | |
TCPSpongeSocket (std::pair< FileDescriptor, FileDescriptor > data_socket_pair, AdaptT &&datagram_interface) | |
Construct LocalStreamSocket fds from socket pair, initialize eventloop. More... | |
void | _initialize_TCP (const TCPConfig &config) |
Set up the TCPConnection and the event loop. More... | |
void | _tcp_loop (const std::function< bool()> &condition) |
Process events while specified condition is true. More... | |
void | _tcp_main () |
Main loop of TCPConnection thread. More... | |
Private Attributes | |
std::atomic_bool | _abort {false} |
Flag used by the owner to force the TCPConnection thread to shut down. More... | |
AdaptT | _datagram_adapter |
Adapter to underlying datagram socket (e.g., UDP or IP) More... | |
EventLoop | _eventloop {} |
eventloop that handles all the events (new inbound datagram, new outbound bytes, new inbound bytes) More... | |
bool | _fully_acked {false} |
Has the outbound data been fully acknowledged by the peer? More... | |
bool | _inbound_shutdown {false} |
Has TCPSpongeSocket shut down the incoming data to the owner? More... | |
bool | _outbound_shutdown {false} |
Has the owner shut down the outbound data to the TCP connection? More... | |
std::optional< TCPConnection > | _tcp {} |
TCP state machine. More... | |
std::thread | _tcp_thread {} |
Handle to the TCPConnection thread; owner thread calls join() in the destructor. More... | |
LocalStreamSocket | _thread_data |
Stream socket for reads and writes between owner and TCP thread. More... | |
Additional Inherited Members | |
Protected Member Functions inherited from Socket | |
Socket (const int domain, const int type) | |
Construct via socket(2). More... | |
Socket (FileDescriptor &&fd, const int domain, const int type) | |
Construct from a file descriptor. More... | |
template<typename option_type > | |
void | setsockopt (const int level, const int option, const option_type &option_value) |
Wrapper around setsockopt(2). More... | |
Multithreaded wrapper around TCPConnection that approximates the Unix sockets API.
This class involves the simultaneous operation of two threads.
One, the "owner" or foreground thread, interacts with this class in much the same way as one would interact with a TCPSocket: it connects or listens, writes to and reads from a reliable data stream, etc. Only the owner thread calls public methods of this class.
The other, the "TCPConnection" thread, takes care of the back-end tasks that the kernel would perform for a TCPSocket: reading and parsing datagrams from the wire, filtering out segments unrelated to the connection, etc.
There are a few notable differences between the TCPSpongeSocket and TCPSocket interfaces:
wait_until_closed
to avoid this) Definition at line 21 of file tcp_sponge_socket.hh.
|
private |
Construct LocalStreamSocket fds from socket pair, initialize eventloop.
[in] | data_socket_pair | is a pair of connected AF_UNIX SOCK_STREAM sockets |
[in] | datagram_interface | is the interface for reading and writing datagrams |
Definition at line 44 of file tcp_sponge_socket.cc.
|
explicit |
Construct from the interface that the TCPConnection thread will use to read and write datagrams.
[in] | datagram_interface | is the underlying interface (e.g. to UDP, IP, or Ethernet) |
Definition at line 175 of file tcp_sponge_socket.cc.
TCPSpongeSocket< AdaptT >::~TCPSpongeSocket |
When a connected socket is destructed, it will send a RST.
Definition at line 179 of file tcp_sponge_socket.cc.
|
delete |
|
delete |
|
private |
Set up the TCPConnection and the event loop.
Definition at line 53 of file tcp_sponge_socket.cc.
|
private |
Process events while specified condition is true.
[in] | condition | is a function returning true if loop should continue |
Definition at line 24 of file tcp_sponge_socket.cc.
|
private |
Main loop of TCPConnection thread.
Definition at line 254 of file tcp_sponge_socket.cc.
|
delete |
void TCPSpongeSocket< AdaptT >::connect | ( | const TCPConfig & | c_tcp, |
const FdAdapterConfig & | c_ad | ||
) |
Connect using the specified configurations; blocks until connect succeeds or fails.
[in] | c_tcp | is the TCPConfig for the TCPConnection |
[in] | c_ad | is the FdAdapterConfig for the FdAdapter |
Definition at line 205 of file tcp_sponge_socket.cc.
void TCPSpongeSocket< AdaptT >::listen_and_accept | ( | const TCPConfig & | c_tcp, |
const FdAdapterConfig & | c_ad | ||
) |
Listen and accept using the specified configurations; blocks until accept succeeds or fails.
[in] | c_tcp | is the TCPConfig for the TCPConnection |
[in] | c_ad | is the FdAdapterConfig for the FdAdapter |
Definition at line 233 of file tcp_sponge_socket.cc.
|
delete |
|
delete |
|
delete |
|
delete |
|
delete |
void TCPSpongeSocket< AdaptT >::wait_until_closed |
Close socket, and wait for TCPConnection to finish
Definition at line 193 of file tcp_sponge_socket.cc.
|
private |
Flag used by the owner to force the TCPConnection thread to shut down.
Definition at line 50 of file tcp_sponge_socket.hh.
|
private |
Adapter to underlying datagram socket (e.g., UDP or IP)
Definition at line 27 of file tcp_sponge_socket.hh.
|
private |
eventloop that handles all the events (new inbound datagram, new outbound bytes, new inbound bytes)
Definition at line 36 of file tcp_sponge_socket.hh.
|
private |
Has the outbound data been fully acknowledged by the peer?
Definition at line 56 of file tcp_sponge_socket.hh.
|
private |
Has TCPSpongeSocket shut down the incoming data to the owner?
Definition at line 52 of file tcp_sponge_socket.hh.
|
private |
Has the owner shut down the outbound data to the TCP connection?
Definition at line 54 of file tcp_sponge_socket.hh.
|
private |
TCP state machine.
Definition at line 33 of file tcp_sponge_socket.hh.
|
private |
Handle to the TCPConnection thread; owner thread calls join() in the destructor.
Definition at line 45 of file tcp_sponge_socket.hh.
|
private |
Stream socket for reads and writes between owner and TCP thread.
Definition at line 24 of file tcp_sponge_socket.hh.