Bitcoin ABC 0.26.3
P2P Digital Currency
|
RAII helper class that manages a socket. More...
#include <sock.h>
Classes | |
struct | EqualSharedPtrSock |
struct | Events |
Auxiliary requested/occurred events to wait for in WaitMany() . More... | |
struct | HashSharedPtrSock |
Public Types | |
using | Event = uint8_t |
using | EventsPerSock = std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > |
On which socket to wait for what events in WaitMany() . | |
Public Member Functions | |
Sock () | |
Default constructor, creates an empty object that does nothing when destroyed. | |
Sock (SOCKET s) | |
Take ownership of an existent socket. | |
Sock (const Sock &)=delete | |
Copy constructor, disabled because closing the same socket twice is undesirable. | |
Sock (Sock &&other) | |
Move constructor, grab the socket from another object and close ours (if set). | |
virtual | ~Sock () |
Destructor, close the socket or do nothing if empty. | |
Sock & | operator= (const Sock &)=delete |
Copy assignment operator, disabled because closing the same socket twice is undesirable. | |
virtual Sock & | operator= (Sock &&other) |
Move assignment operator, grab the socket from another object and close ours (if set). | |
virtual SOCKET | Get () const |
Get the value of the contained socket. | |
virtual SOCKET | Release () |
Get the value of the contained socket and drop ownership. | |
virtual void | Reset () |
Close if non-empty. | |
virtual ssize_t | Send (const void *data, size_t len, int flags) const |
send(2) wrapper. | |
virtual ssize_t | Recv (void *buf, size_t len, int flags) const |
recv(2) wrapper. | |
virtual int | Connect (const sockaddr *addr, socklen_t addr_len) const |
connect(2) wrapper. | |
virtual std::unique_ptr< Sock > | Accept (sockaddr *addr, socklen_t *addr_len) const |
accept(2) wrapper. | |
virtual int | GetSockOpt (int level, int opt_name, void *opt_val, socklen_t *opt_len) const |
getsockopt(2) wrapper. | |
virtual bool | Wait (std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const |
Wait for readiness for input (recv) or output (send). | |
virtual bool | WaitMany (std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const |
Same as Wait() , but wait on many sockets within the same timeout. | |
virtual void | SendComplete (const std::string &data, std::chrono::milliseconds timeout, CThreadInterrupt &interrupt) const |
Send the given data, retrying on transient errors. | |
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. | |
virtual bool | IsConnected (std::string &errmsg) const |
Check if still connected. | |
Static Public Attributes | |
static constexpr Event | RECV = 0b001 |
If passed to Wait() , then it will wait for readiness to read from the socket. | |
static constexpr Event | SEND = 0b010 |
If passed to Wait() , then it will wait for readiness to send to the socket. | |
static constexpr Event | ERR = 0b100 |
Ignored if passed to Wait() , but could be set in the occurred events if an exceptional condition has occurred on the socket or if it has been disconnected. | |
Protected Attributes | |
SOCKET | m_socket |
Contained socket. | |
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.
using Sock::EventsPerSock = std::unordered_map<std::shared_ptr<const Sock>, Events, HashSharedPtrSock, EqualSharedPtrSock> |
On which socket to wait for what events in WaitMany()
.
The shared_ptr
is copied into the map to ensure that the Sock
object is not destroyed (its destructor would close the underlying socket). If this happens shortly before or after we call poll(2)
and a new socket gets created under the same file descriptor number then the report from WaitMany()
will be bogus.
Sock::Sock | ( | ) |
|
explicit |
|
delete |
Copy constructor, disabled because closing the same socket twice is undesirable.
Sock::Sock | ( | Sock && | other | ) |
|
virtual |
accept(2) wrapper.
Equivalent to std::make_unique<Sock>(accept(this->Get(), addr, addr_len))
. Code that uses this wrapper can be unit tested if this method is overridden by a mock Sock implementation. The returned unique_ptr is empty if accept()
failed in which case errno will be set.
Definition at line 77 of file sock.cpp.
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 73 of file sock.cpp.
|
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 102 of file sock.cpp.
|
virtual |
Copy assignment operator, disabled because closing the same socket twice is undesirable.
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 69 of file sock.cpp.
|
virtual |
Read from socket until a terminator character is encountered.
Will never consume bytes past the terminator from the socket.
[in] | terminator | Character up to which to read from the socket. |
[in] | timeout | Timeout for the entire operation. |
[in] | interrupt | If this is signaled then the operation is canceled. |
[in] | max_data | The 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. |
std::runtime_error | if the operation cannot be completed. In this case some bytes may have been consumed from the socket. |
Definition at line 260 of file sock.cpp.
|
virtual |
|
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 65 of file sock.cpp.
|
virtual |
Send the given data, retrying on transient errors.
[in] | data | Data to send. |
[in] | timeout | Timeout for the entire operation. |
[in] | interrupt | If this is signaled then the operation is canceled. |
std::runtime_error | if the operation cannot be completed. In this case only some of the data will be written to the socket. |
Definition at line 215 of file sock.cpp.
|
virtual |
Wait for readiness for input (recv) or output (send).
[in] | timeout | Wait this much for at least one of the requested events to occur. |
[in] | requested | Wait for those events, bitwise-or of RECV and SEND . |
[out] | occurred | If not nullptr and the function returns true , then this indicates which of the requested events occurred (ERR will be added, even if not requested, if an exceptional event occurs on the socket). A timeout is indicated by return value of true and occurred being set to 0. |
occurred
of 0 is returned), false otherwise Definition at line 108 of file sock.cpp.
|
virtual |
Same as Wait()
, but wait on many sockets within the same timeout.
[in] | timeout | Wait this long for at least one of the requested events to occur. |
[in,out] | events_per_sock | Wait for the requested events on these sockets and set occurred for the events that actually occurred. |
what[].occurred
are returned as 0), false otherwise Definition at line 128 of file sock.cpp.
|
protected |