Bitcoin Core 31.99.0
P2P Digital Currency
sock.h
Go to the documentation of this file.
1// Copyright (c) 2020-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_UTIL_SOCK_H
6#define BITCOIN_UTIL_SOCK_H
7
8#include <compat/compat.h>
9#include <util/time.h>
10
11#include <cstdint>
12#include <limits>
13#include <memory>
14#include <span>
15#include <string>
16#include <unordered_map>
17
19
24static constexpr auto MAX_WAIT_FOR_IO = 1s;
25
26inline bool IOErrorIsPermanent(int err)
27{
28 return err != WSAEAGAIN && err != WSAEINTR && err != WSAEWOULDBLOCK && err != WSAEINPROGRESS;
29}
30
34class Sock
35{
36public:
37 Sock() = delete;
38
42 explicit Sock(SOCKET s);
43
47 Sock(const Sock&) = delete;
48
52 Sock(Sock&& other);
53
57 virtual ~Sock();
58
62 Sock& operator=(const Sock&) = delete;
63
67 virtual Sock& operator=(Sock&& other);
68
73 [[nodiscard]] virtual ssize_t Send(const void* data, size_t len, int flags) const;
74
79 [[nodiscard]] virtual ssize_t Recv(void* buf, size_t len, int flags) const;
80
85 [[nodiscard]] virtual int Connect(const sockaddr* addr, socklen_t addr_len) const;
86
91 [[nodiscard]] virtual int Bind(const sockaddr* addr, socklen_t addr_len) const;
92
97 [[nodiscard]] virtual int Listen(int backlog) const;
98
105 [[nodiscard]] virtual std::unique_ptr<Sock> Accept(sockaddr* addr, socklen_t* addr_len) const;
106
112 [[nodiscard]] virtual int GetSockOpt(int level,
113 int opt_name,
114 void* opt_val,
115 socklen_t* opt_len) const;
116
122 [[nodiscard]] virtual int SetSockOpt(int level,
123 int opt_name,
124 const void* opt_val,
125 socklen_t opt_len) const;
126
132 [[nodiscard]] virtual int GetSockName(sockaddr* name, socklen_t* name_len) const;
133
138 [[nodiscard]] virtual bool SetNonBlocking() const;
139
144 [[nodiscard]] virtual bool IsSelectable() const;
145
146 using Event = uint8_t;
147
151 static constexpr Event RecvEvent = 0b001;
152
156 static constexpr Event SendEvent = 0b010;
157
162 static constexpr Event ErrorEvent = 0b100;
163
174 [[nodiscard]] virtual bool Wait(std::chrono::milliseconds timeout,
175 Event requested,
176 Event* occurred = nullptr) const;
177
181 struct Events {
182 explicit Events(Event req) : requested{req} {}
185 };
186
188 size_t operator()(const std::shared_ptr<const Sock>& s) const
189 {
190 return s ? s->m_socket : std::numeric_limits<SOCKET>::max();
191 }
192 };
193
195 bool operator()(const std::shared_ptr<const Sock>& lhs,
196 const std::shared_ptr<const Sock>& rhs) const
197 {
198 if (lhs && rhs) {
199 return lhs->m_socket == rhs->m_socket;
200 }
201 if (!lhs && !rhs) {
202 return true;
203 }
204 return false;
205 }
206 };
207
216 using EventsPerSock = std::unordered_map<std::shared_ptr<const Sock>, Events, HashSharedPtrSock, EqualSharedPtrSock>;
217
226 [[nodiscard]] virtual bool WaitMany(std::chrono::milliseconds timeout,
227 EventsPerSock& events_per_sock) const;
228
229 /* Higher level, convenience, methods. These may throw. */
230
239 virtual void SendComplete(std::span<const unsigned char> data,
240 std::chrono::milliseconds timeout,
241 CThreadInterrupt& interrupt) const;
242
246 virtual void SendComplete(std::span<const char> data,
247 std::chrono::milliseconds timeout,
248 CThreadInterrupt& interrupt) const;
249
262 [[nodiscard]] virtual std::string RecvUntilTerminator(uint8_t terminator,
263 std::chrono::milliseconds timeout,
264 CThreadInterrupt& interrupt,
265 size_t max_data) const;
266
272 [[nodiscard]] virtual bool IsConnected(std::string& errmsg) const;
273
277 bool operator==(SOCKET s) const;
278
279protected:
284
285private:
289 void Close();
290};
291
293std::string NetworkErrorString(int err);
294
295#endif // BITCOIN_UTIL_SOCK_H
int flags
Definition: bitcoin-tx.cpp:530
A helper class for interruptible sleeps.
RAII helper class that manages a socket and closes it automatically when it goes out of scope.
Definition: sock.h:35
static constexpr Event RecvEvent
If passed to Wait(), then it will wait for readiness to read from the socket.
Definition: sock.h:151
virtual std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const
accept(2) wrapper.
Definition: sock.cpp:72
virtual ssize_t Send(const void *data, size_t len, int flags) const
send(2) wrapper.
Definition: sock.cpp:47
SOCKET m_socket
Contained socket.
Definition: sock.h:283
Sock & operator=(const Sock &)=delete
Copy assignment operator, disabled because closing the same socket twice is undesirable.
virtual int Bind(const sockaddr *addr, socklen_t addr_len) const
bind(2) wrapper.
Definition: sock.cpp:62
virtual bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const
Wait for readiness for input (recv) or output (send).
Definition: sock.cpp:141
virtual ~Sock()
Destructor, close the socket or do nothing if empty.
Definition: sock.cpp:37
virtual void SendComplete(std::span< const unsigned char > data, std::chrono::milliseconds timeout, CThreadInterrupt &interrupt) const
Send the given data, retrying on transient errors.
Definition: sock.cpp:249
uint8_t Event
Definition: sock.h:146
Sock(const Sock &)=delete
Copy constructor, disabled because closing the same socket twice is undesirable.
static constexpr Event SendEvent
If passed to Wait(), then it will wait for readiness to send to the socket.
Definition: sock.h:156
virtual int GetSockName(sockaddr *name, socklen_t *name_len) const
getsockname(2) wrapper.
Definition: sock.cpp:108
void Close()
Close m_socket if it is not INVALID_SOCKET.
Definition: sock.cpp:405
virtual bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const
Same as Wait(), but wait on many sockets within the same timeout.
Definition: sock.cpp:163
virtual bool IsConnected(std::string &errmsg) const
Check if still connected.
Definition: sock.cpp:380
virtual int SetSockOpt(int level, int opt_name, const void *opt_val, socklen_t opt_len) const
setsockopt(2) wrapper.
Definition: sock.cpp:103
static constexpr Event ErrorEvent
Ignored if passed to Wait(), but could be set in the occurred events if an exceptional condition has ...
Definition: sock.h:162
virtual int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const
getsockopt(2) wrapper.
Definition: sock.cpp:98
virtual int Connect(const sockaddr *addr, socklen_t addr_len) const
connect(2) wrapper.
Definition: sock.cpp:57
virtual ssize_t Recv(void *buf, size_t len, int flags) const
recv(2) wrapper.
Definition: sock.cpp:52
Sock()=delete
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.
Definition: sock.cpp:297
virtual int Listen(int backlog) const
listen(2) wrapper.
Definition: sock.cpp:67
virtual bool SetNonBlocking() const
Set the non-blocking option on the socket.
Definition: sock.cpp:113
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
Definition: sock.h:216
virtual bool IsSelectable() const
Check if the underlying socket can be used for select(2) (or the Wait() method).
Definition: sock.cpp:132
bool operator==(SOCKET s) const
Check if the internal socket is equal to s.
Definition: sock.cpp:421
#define WSAEWOULDBLOCK
Definition: compat.h:61
unsigned int SOCKET
Definition: compat.h:57
#define WSAEINPROGRESS
Definition: compat.h:65
#define WSAEINTR
Definition: compat.h:64
#define WSAEAGAIN
Definition: compat.h:62
const char * name
Definition: rest.cpp:50
static constexpr auto MAX_WAIT_FOR_IO
Maximum time to wait for I/O readiness.
Definition: sock.h:24
bool IOErrorIsPermanent(int err)
Definition: sock.h:26
std::string NetworkErrorString(int err)
Return readable error string for a network error code.
Definition: sock.cpp:426
bool operator()(const std::shared_ptr< const Sock > &lhs, const std::shared_ptr< const Sock > &rhs) const
Definition: sock.h:195
Auxiliary requested/occurred events to wait for in WaitMany().
Definition: sock.h:181
Event requested
Definition: sock.h:183
Events(Event req)
Definition: sock.h:182
Event occurred
Definition: sock.h:184
size_t operator()(const std::shared_ptr< const Sock > &s) const
Definition: sock.h:188