1 #ifndef LIBFILEZILLA_SOCKET_HEADER
2 #define LIBFILEZILLA_SOCKET_HEADER
62 return (
static_cast<std::underlying_type_t<socket_event_flag>
>(lhs) &
static_cast<std::underlying_type_t<socket_event_flag>
>(rhs)) != 0;
66 return static_cast<socket_event_flag>(
static_cast<std::underlying_type_t<socket_event_flag>
>(lhs) |
static_cast<std::underlying_type_t<socket_event_flag>
>(rhs));
102 socket_event_source*
const root_{};
106 struct socket_event_type;
133 struct hostaddress_event_type{};
175 int set_buffer_sizes(
int size_receive,
int size_send);
178 address_type address_family()
const;
185 std::string local_ip(
bool strip_zone_index =
false)
const;
192 int local_port(
int& error)
const;
194 static std::string address_to_string(sockaddr
const* addr,
int addr_len,
bool with_port =
true,
bool strip_zone_index =
false);
195 static std::string address_to_string(
char const* buf,
int buf_len);
202 bool bind(std::string
const& address);
205 typedef intptr_t socket_t;
207 typedef int socket_t;
211 friend class socket_thread;
224 socket_thread* socket_thread_{};
230 unsigned int port_{};
234 int buffer_sizes_[2];
261 std::swap(fd_, rhs.fd_);
265 socket_base::socket_t detach() {
266 socket_base::socket_t ret = fd_;
271 explicit operator bool()
const {
return fd_ != -1; }
274 socket_base::socket_t fd_{-1};
287 friend class socket_thread;
303 int listen(address_type family,
int port = 0);
306 std::unique_ptr<socket> accept(
int& error,
fz::event_handler * handler =
nullptr);
364 virtual int read(
void*
buffer,
unsigned int size,
int& error) = 0;
365 virtual int write(
void const* buffer,
unsigned int size,
int& error) = 0;
367 template<
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
368 int read(
void* buffer, T size,
int& error)
375 return read(buffer, static_cast<unsigned int>(size), error);
377 template<
typename T, std::enable_if_t<std::is_
unsigned_v<T> && (sizeof(T) > sizeof(
unsigned int)),
int> = 0>
378 int read(
void* buffer, T size,
int& error)
380 if (size > std::numeric_limits<unsigned int>::max()) {
381 size = std::numeric_limits<unsigned int>::max();
383 return read(buffer, static_cast<unsigned int>(size), error);
386 template<
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
387 int write(
void const* buffer, T size,
int& error)
394 return write(buffer,
static_cast<std::make_unsigned_t<T>
>(size), error);
396 template<
typename T, std::enable_if_t<std::is_
unsigned_v<T> && (sizeof(T) > sizeof(
unsigned int)),
int> = 0>
397 int write(
void const* buffer, T size,
int& error)
399 if (size > std::numeric_limits<unsigned int>::max()) {
400 size = std::numeric_limits<unsigned int>::max();
402 return write(buffer, static_cast<unsigned int>(size), error);
408 virtual int peer_port(
int& error)
const = 0;
410 virtual int connect(
native_string const& host,
unsigned int port, address_type family = address_type::unknown) = 0;
424 virtual int shutdown() = 0;
427 virtual int shutdown_read() = 0;
447 friend class socket_thread;
458 bool is_connected()
const {
476 virtual int connect(
native_string const& host,
unsigned int port, address_type family = address_type::unknown)
override;
493 virtual int read(
void *
buffer,
unsigned int size,
int& error)
override;
510 virtual int write(
void const* buffer,
unsigned int size,
int& error)
override;
517 std::string peer_ip(
bool strip_zone_index =
false)
const;
527 virtual int peer_port(
int& error)
const override;
535 int ideal_send_buffer_size();
537 virtual int shutdown()
override;
559 flag_keepalive = 0x02
562 int flags()
const {
return flags_; }
565 void set_flags(
int flags,
bool enable);
568 void set_flags(
int flags);
575 void set_keepalive_interval(duration
const& d);
579 socket_t get_descriptor();
631 virtual int peer_port(
int& error)
const override {
return next_layer_.peer_port(error); }
657 virtual int shutdown_read()
override;
659 virtual int connect(
native_string const& host,
unsigned int port, address_type family = address_type::unknown)
override {
660 return next_layer_.connect(host, port, family);
664 return next_layer_.shutdown();
668 return next_layer_.get_state();
677 void forward_socket_event(socket_event_source* source,
socket_event_flag t,
int error);
684 void forward_hostaddress_event(socket_event_source* source, std::string
const& address);
692 event_handler* event_handler_{};
693 socket_interface& next_layer_;
694 bool event_passthrough_{};
716 #define EISCONN WSAEISCONN
719 #define EINPROGRESS WSAEINPROGRESS
722 #define EAFNOSUPPORT WSAEAFNOSUPPORT
725 #define EADDRINUSE WSAEADDRINUSE
728 #define ENOBUFS WSAENOBUFS
730 #ifndef EPROTONOSUPPORT
731 #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
734 #define EALREADY WSAEALREADY
737 #define ECONNREFUSED WSAECONNREFUSED
740 #define ENOTSOCK WSAENOTSOCK
743 #define ETIMEDOUT WSAETIMEDOUT
746 #define ENETUNREACH WSAENETUNREACH
749 #define EHOSTUNREACH WSAEHOSTUNREACH
752 #define ENOTCONN WSAENOTCONN
755 #define ENETRESET WSAENETRESET
758 #define EOPNOTSUPP WSAEOPNOTSUPP
761 #define ESHUTDOWN WSAESHUTDOWN
764 #define EMSGSIZE WSAEMSGSIZE
767 #define ECONNABORTED WSAECONNABORTED
770 #define ECONNRESET WSAECONNRESET
773 #define EHOSTDOWN WSAEHOSTDOWN
fz::socket_event_flag change_socket_event_handler(event_handler *old_handler, event_handler *new_handler, socket_event_source const *const source, fz::socket_event_flag remove)
Changes all pending socket events from source.
std::string socket_error_string(int error)
Gets a symbolic name for socket errors.
A simple scoped lock.
Definition: mutex.hpp:64
Interface for sockets.
Definition: socket.hpp:358
Lightweight holder for socket descriptors.
Definition: socket.hpp:249
simple_event< socket_event_type, socket_event_source *, socket_event_flag, int > socket_event
Definition: socket.hpp:106
virtual int shutdown_read() override
Definition: socket.hpp:577
Simple handler for asynchronous event processing.
Definition: event_handler.hpp:54
socket_interface & next()
The next layer further down. Usually another layer or the actual socket.
Definition: socket.hpp:634
Declares the event_handler class.
Socket has failed. Further events disabled.
Common base clase for fz::socket and fz::listen_socket.
Definition: socket.hpp:165
Simple Listen socket.
Definition: socket.hpp:284
Various functions to deal with IP address strings.
Socket has been closed. Further events disabled.
socket_event_source * root() const
Gets the root source.
Definition: socket.hpp:92
This is the recommended event class.
Definition: event.hpp:65
virtual int peer_port(int &error) const override
Definition: socket.hpp:631
simple_event< hostaddress_event_type, socket_event_source *, std::string > hostaddress_event
Definition: socket.hpp:138
IPv6 capable, non-blocking socket class.
Definition: socket.hpp:445
virtual int shutdown() override
Signals peers that we want to close the connections.
Definition: socket.hpp:663
void remove_socket_events(event_handler *handler, socket_event_source const *const source)
Remove all pending socket events from source sent to handler.
A base class for socket layers.
Definition: socket.hpp:607
virtual native_string peer_host() const override
Definition: socket.hpp:624
std::wstring native_string
A string in the system's native character type and encoding. Note: This typedef changes depending on...
Definition: string.hpp:33
socket_state
State transitions are monotonically increasing.
Definition: socket.hpp:326
Only in listening state you can get a connection event.
The namespace used by libfilezilla.
Definition: apply.hpp:17
listen_socket_state
Definition: socket.hpp:239
native_string socket_error_description(int error)
Gets a human-readable, translated description of the error.
Socket is in its normal working state. You can get send and receive events.
All classes sending socket events should derive from this.
Definition: socket.hpp:83
The duration class represents a time interval in milliseconds.
Definition: time.hpp:288
Sets some global macros and further includes string.hpp.
Write side has finished shutting down. Receive still working normally.
The buffer class is a simple buffer where data can be appended at the end and consumed at the front...
Definition: buffer.hpp:26
A dumb thread-pool for asynchronous tasks.
Definition: thread_pool.hpp:62
socket_event_flag
The type of a socket event.
Definition: socket.hpp:33