Bitcoin ABC 0.30.3
P2P Digital Currency
Public Types | Public Member Functions | Static Public Attributes | Protected Attributes | List of all members
Sock Class Reference

RAII helper class that manages a socket. More...

#include <sock.h>

Public Types

using Event = uint8_t
 

Public Member Functions

 Sock ()
 Default constructor, creates an empty object that does nothing when destroyed. More...
 
 Sock (SOCKET s)
 Take ownership of an existent socket. More...
 
 Sock (const Sock &)=delete
 Copy constructor, disabled because closing the same socket twice is undesirable. More...
 
 Sock (Sock &&other)
 Move constructor, grab the socket from another object and close ours (if set). More...
 
virtual ~Sock ()
 Destructor, close the socket or do nothing if empty. More...
 
Sockoperator= (const Sock &)=delete
 Copy assignment operator, disabled because closing the same socket twice is undesirable. More...
 
virtual Sockoperator= (Sock &&other)
 Move assignment operator, grab the socket from another object and close ours (if set). More...
 
virtual SOCKET Get () const
 Get the value of the contained socket. More...
 
virtual SOCKET Release ()
 Get the value of the contained socket and drop ownership. More...
 
virtual void Reset ()
 Close if non-empty. More...
 
virtual ssize_t Send (const void *data, size_t len, int flags) const
 send(2) wrapper. More...
 
virtual ssize_t Recv (void *buf, size_t len, int flags) const
 recv(2) wrapper. More...
 
virtual int Connect (const sockaddr *addr, socklen_t addr_len) const
 connect(2) wrapper. More...
 
virtual int GetSockOpt (int level, int opt_name, void *opt_val, socklen_t *opt_len) const
 getsockopt(2) wrapper. More...
 
virtual bool Wait (std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const
 Wait for readiness for input (recv) or output (send). More...
 
virtual void SendComplete (const std::string &data, std::chrono::milliseconds timeout, CThreadInterrupt &interrupt) const
 Send the given data, retrying on transient errors. More...
 
virtual std::string RecvUntilTerminator (uint8_t terminator, std::chrono::milliseconds timeout, CThreadInterrupt &interrupt, size_t max_data) const
 Read from socket until a terminator character is encountered. More...
 
virtual bool IsConnected (std::string &errmsg) const
 Check if still connected. More...
 

Static Public Attributes

static constexpr Event RECV = 0b01
 If passed to Wait(), then it will wait for readiness to read from the socket. More...
 
static constexpr Event SEND = 0b10
 If passed to Wait(), then it will wait for readiness to send to the socket. More...
 

Protected Attributes

SOCKET m_socket
 Contained socket. More...
 

Detailed Description

RAII helper class that manages a socket.

Mimics std::unique_ptr, but instead of a pointer it contains a socket and closes it automatically when it goes out of scope.

Definition at line 26 of file sock.h.

Member Typedef Documentation

◆ Event

using Sock::Event = uint8_t

Definition at line 116 of file sock.h.

Constructor & Destructor Documentation

◆ Sock() [1/4]

Sock::Sock ( )

Default constructor, creates an empty object that does nothing when destroyed.

Definition at line 30 of file sock.cpp.

◆ Sock() [2/4]

Sock::Sock ( SOCKET  s)
explicit

Take ownership of an existent socket.

Definition at line 32 of file sock.cpp.

◆ Sock() [3/4]

Sock::Sock ( const Sock )
delete

Copy constructor, disabled because closing the same socket twice is undesirable.

◆ Sock() [4/4]

Sock::Sock ( Sock &&  other)

Move constructor, grab the socket from another object and close ours (if set).

Definition at line 34 of file sock.cpp.

◆ ~Sock()

Sock::~Sock ( )
virtual

Destructor, close the socket or do nothing if empty.

Definition at line 39 of file sock.cpp.

Here is the call graph for this function:

Member Function Documentation

◆ Connect()

int Sock::Connect ( const sockaddr *  addr,
socklen_t  addr_len 
) const
virtual

connect(2) wrapper.

Equivalent to connect(this->Get(), addr, addrlen). Code that uses this wrapper can be unit tested if this method is overridden by a mock Sock implementation.

Definition at line 72 of file sock.cpp.

Here is the caller graph for this function:

◆ Get()

SOCKET Sock::Get ( ) const
virtual

Get the value of the contained socket.

Returns
socket or INVALID_SOCKET if empty

Definition at line 50 of file sock.cpp.

Here is the caller graph for this function:

◆ GetSockOpt()

int Sock::GetSockOpt ( int  level,
int  opt_name,
void *  opt_val,
socklen_t *  opt_len 
) const
virtual

getsockopt(2) wrapper.

Equivalent to getsockopt(this->Get(), level, opt_name, opt_val, opt_len). Code that uses this wrapper can be unit tested if this method is overridden by a mock Sock implementation.

Definition at line 76 of file sock.cpp.

Here is the caller graph for this function:

◆ IsConnected()

bool Sock::IsConnected ( std::string &  errmsg) const
virtual

Check if still connected.

Parameters
[out]errmsgThe error string, if the socket has been disconnected.
Returns
true if connected

Definition at line 289 of file sock.cpp.

Here is the call graph for this function:

◆ operator=() [1/2]

Sock & Sock::operator= ( const Sock )
delete

Copy assignment operator, disabled because closing the same socket twice is undesirable.

◆ operator=() [2/2]

Sock & Sock::operator= ( Sock &&  other)
virtual

Move assignment operator, grab the socket from another object and close ours (if set).

Definition at line 43 of file sock.cpp.

Here is the call graph for this function:

◆ Recv()

ssize_t Sock::Recv ( void *  buf,
size_t  len,
int  flags 
) const
virtual

recv(2) wrapper.

Equivalent to recv(this->Get(), buf, len, flags);. Code that uses this wrapper can be unit tested if this method is overridden by a mock Sock implementation.

Definition at line 68 of file sock.cpp.

Here is the caller graph for this function:

◆ RecvUntilTerminator()

std::string Sock::RecvUntilTerminator ( uint8_t  terminator,
std::chrono::milliseconds  timeout,
CThreadInterrupt interrupt,
size_t  max_data 
) const
virtual

Read from socket until a terminator character is encountered.

Will never consume bytes past the terminator from the socket.

Parameters
[in]terminatorCharacter up to which to read from the socket.
[in]timeoutTimeout for the entire operation.
[in]interruptIf this is signaled then the operation is canceled.
[in]max_dataThe maximum amount of data (in bytes) to receive. If this many bytes are received and there is still no terminator, then this method will throw an exception.
Returns
The data that has been read, without the terminating character.
Exceptions
std::runtime_errorif the operation cannot be completed. In this case some bytes may have been consumed from the socket.

Definition at line 194 of file sock.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Release()

SOCKET Sock::Release ( )
virtual

Get the value of the contained socket and drop ownership.

It will not be closed by the destructor after this call.

Returns
socket or INVALID_SOCKET if empty

Definition at line 54 of file sock.cpp.

◆ Reset()

void Sock::Reset ( )
virtual

Close if non-empty.

Definition at line 60 of file sock.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Send()

ssize_t Sock::Send ( const void *  data,
size_t  len,
int  flags 
) const
virtual

send(2) wrapper.

Equivalent to send(this->Get(), data, len, flags);. Code that uses this wrapper can be unit tested if this method is overridden by a mock Sock implementation.

Definition at line 64 of file sock.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SendComplete()

void Sock::SendComplete ( const std::string &  data,
std::chrono::milliseconds  timeout,
CThreadInterrupt interrupt 
) const
virtual

Send the given data, retrying on transient errors.

Parameters
[in]dataData to send.
[in]timeoutTimeout for the entire operation.
[in]interruptIf this is signaled then the operation is canceled.
Exceptions
std::runtime_errorif the operation cannot be completed. In this case only some of the data will be written to the socket.

Definition at line 149 of file sock.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Wait()

bool Sock::Wait ( std::chrono::milliseconds  timeout,
Event  requested,
Event occurred = nullptr 
) const
virtual

Wait for readiness for input (recv) or output (send).

Parameters
[in]timeoutWait this much for at least one of the requested events to occur.
[in]requestedWait for those events, bitwise-or of RECV and SEND.
[out]occurredIf not nullptr and true is returned, then upon return this indicates which of the requested events occurred. A timeout is indicated by return value of true and occurred being set to 0.
Returns
true on success and false otherwise

Definition at line 82 of file sock.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_socket

SOCKET Sock::m_socket
protected

Contained socket.

INVALID_SOCKET designates the object is empty.

Definition at line 188 of file sock.h.

◆ RECV

constexpr Event Sock::RECV = 0b01
staticconstexpr

If passed to Wait(), then it will wait for readiness to read from the socket.

Definition at line 122 of file sock.h.

◆ SEND

constexpr Event Sock::SEND = 0b10
staticconstexpr

If passed to Wait(), then it will wait for readiness to send to the socket.

Definition at line 128 of file sock.h.


The documentation for this class was generated from the following files: