libfly  6.2.2
C++20 utility library for Linux, macOS, and Windows
base_socket.hpp
1 #pragma once
2 
3 #include "fly/net/socket/concepts.hpp"
4 #include "fly/net/socket/types.hpp"
5 
6 #include <cstdint>
7 #include <memory>
8 #include <optional>
9 #include <string_view>
10 
11 namespace fly::net {
12 
13 class NetworkConfig;
14 class SocketService;
15 
16 } // namespace fly::net
17 
18 namespace fly::net::detail {
19 
27 template <fly::net::IPEndpoint EndpointType>
29 {
30 public:
31  using endpoint_type = EndpointType;
32  using address_type = typename EndpointType::address_type;
33 
37  static constexpr bool is_ipv4();
38 
42  static constexpr bool is_ipv6();
43 
51  static std::optional<address_type> hostname_to_address(std::string_view hostname);
52 
56  bool is_open() const;
57 
61  socket_type handle() const;
62 
66  std::uint64_t socket_id() const;
67 
75  bool set_io_mode(fly::net::IOMode mode);
76 
80  fly::net::IOMode io_mode() const;
81 
87  std::optional<EndpointType> local_endpoint() const;
88 
92  void close();
93 
102  bool bind(const EndpointType &endpoint, BindMode mode) const;
103 
113  bool bind(std::string_view hostname, port_type port, BindMode mode) const;
114 
115 protected:
123  BaseSocket(
124  std::shared_ptr<fly::net::NetworkConfig> config,
125  socket_type handle,
126  fly::net::IOMode mode) noexcept;
127 
136  BaseSocket(
137  const std::shared_ptr<fly::net::SocketService> &service,
138  std::shared_ptr<fly::net::NetworkConfig> config,
139  socket_type handle) noexcept;
140 
146  BaseSocket(BaseSocket &&socket) noexcept;
147 
151  virtual ~BaseSocket() noexcept;
152 
160  BaseSocket &operator=(BaseSocket &&socket) noexcept;
161 
165  std::shared_ptr<fly::net::SocketService> socket_service() const;
166 
170  std::shared_ptr<fly::net::NetworkConfig> network_config() const;
171 
175  std::size_t packet_size() const;
176 
177 private:
178  BaseSocket(const BaseSocket &) = delete;
179  BaseSocket &operator=(const BaseSocket &) = delete;
180 
181  std::weak_ptr<fly::net::SocketService> m_weak_socket_service;
182 
183  std::shared_ptr<fly::net::NetworkConfig> m_config;
184 
185  socket_type m_socket_handle;
186  std::uint64_t m_socket_id;
187  fly::net::IOMode m_mode;
188 };
189 
190 //==================================================================================================
191 template <fly::net::IPEndpoint EndpointType>
193 {
194  return EndpointType::is_ipv4();
195 }
196 
197 //==================================================================================================
198 template <fly::net::IPEndpoint EndpointType>
200 {
201  return EndpointType::is_ipv6();
202 }
203 
204 } // namespace fly::net::detail
Definition: base_socket.hpp:29
virtual ~BaseSocket() noexcept
Definition: base_socket.cpp:59
fly::net::IOMode io_mode() const
Definition: base_socket.cpp:132
bool bind(const EndpointType &endpoint, BindMode mode) const
Definition: base_socket.cpp:162
static constexpr bool is_ipv4()
Definition: base_socket.hpp:192
std::size_t packet_size() const
Definition: base_socket.cpp:196
std::shared_ptr< fly::net::NetworkConfig > network_config() const
Definition: base_socket.cpp:189
BaseSocket(std::shared_ptr< fly::net::NetworkConfig > config, socket_type handle, fly::net::IOMode mode) noexcept
Definition: base_socket.cpp:22
socket_type handle() const
Definition: base_socket.cpp:102
bool set_io_mode(fly::net::IOMode mode)
Definition: base_socket.cpp:116
std::uint64_t socket_id() const
Definition: base_socket.cpp:109
void close()
Definition: base_socket.cpp:146
static std::optional< address_type > hostname_to_address(std::string_view hostname)
Definition: base_socket.cpp:81
BaseSocket & operator=(BaseSocket &&socket) noexcept
Definition: base_socket.cpp:66
bool is_open() const
Definition: base_socket.cpp:95
std::shared_ptr< fly::net::SocketService > socket_service() const
Definition: base_socket.cpp:182
static constexpr bool is_ipv6()
Definition: base_socket.hpp:199
std::optional< EndpointType > local_endpoint() const
Definition: base_socket.cpp:139