![]() |
Bitcoin ABC 0.32.12
P2P Digital Currency
|
RAII helper class that manages a socket and closes it automatically when it goes out of scope. 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(). More... | |
Public Member Functions | |
| Sock ()=delete | |
| 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... | |
| Sock & | operator= (const Sock &)=delete |
| Copy assignment operator, disabled because closing the same socket twice is undesirable. More... | |
| virtual Sock & | operator= (Sock &&other) |
| Move assignment operator, grab the socket from another object and close ours (if set). 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 | Bind (const sockaddr *addr, socklen_t addr_len) const |
| bind(2) wrapper. More... | |
| virtual int | Listen (int backlog) const |
| listen(2) wrapper. More... | |
| virtual std::unique_ptr< Sock > | Accept (sockaddr *addr, socklen_t *addr_len) const |
| accept(2) wrapper. More... | |
| virtual int | GetSockOpt (int level, int opt_name, void *opt_val, socklen_t *opt_len) const |
| getsockopt(2) wrapper. More... | |
| virtual int | SetSockOpt (int level, int opt_name, const void *opt_val, socklen_t opt_len) const |
| setsockopt(2) wrapper. More... | |
| virtual int | GetSockName (sockaddr *name, socklen_t *name_len) const |
| getsockname(2) wrapper. More... | |
| virtual bool | SetNonBlocking () const |
| Set the non-blocking option on the socket. More... | |
| virtual bool | IsSelectable () const |
Check if the underlying socket can be used for select(2) (or the Wait() method). 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 bool | WaitMany (std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const |
Same as Wait(), but wait on many sockets within the same timeout. More... | |
| int | WaitReadableOrException (timeval *timeout) const |
| Wait until the socket is readable or has an exceptional condition, or the timeout expires, via select(m_socket, &fdsetRecv, nullptr, &fdsetError, timeout). 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... | |
| bool | operator== (SOCKET s) const |
Check if the internal socket is equal to s. More... | |
Static Public Attributes | |
| static constexpr Event | RECV = 0b001 |
If passed to Wait(), then it will wait for readiness to read from the socket. More... | |
| static constexpr Event | SEND = 0b010 |
If passed to Wait(), then it will wait for readiness to send to the socket. More... | |
| 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. More... | |
Protected Attributes | |
| SOCKET | m_socket |
| Contained socket. More... | |
Private Member Functions | |
| void | Close () |
Close m_socket if it is not INVALID_SOCKET. More... | |
RAII helper class that manages a socket and closes it automatically when it goes out of scope.
| using Sock::Event = uint8_t |
| 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.
|
delete |
|
explicit |
|
delete |
Copy constructor, disabled because closing the same socket twice is undesirable.
| Sock::Sock | ( | Sock && | other | ) |
|
virtual |
|
virtual |
|
virtual |
|
private |
|
virtual |
|
virtual |
|
virtual |
|
virtual |
|
virtual |
|
virtual |
Copy assignment operator, disabled because closing the same socket twice is undesirable.
| bool Sock::operator== | ( | SOCKET | s | ) | const |
|
virtual |
|
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 299 of file sock.cpp.
|
virtual |
|
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 254 of file sock.cpp.
|
virtual |
|
virtual |
|
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 136 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 156 of file sock.cpp.
| int Sock::WaitReadableOrException | ( | timeval * | timeout | ) | const |
Wait until the socket is readable or has an exceptional condition, or the timeout expires, via select(m_socket, &fdsetRecv, nullptr, &fdsetError, timeout).
Returns >0 if ready/error, 0 on timeout, <0 on select failure. This function is used in the seeder only.
|
staticconstexpr |
|
protected |
|
staticconstexpr |
|
staticconstexpr |