1 #ifndef LIBFILEZILLA_SOCKET_HEADER 2 #define LIBFILEZILLA_SOCKET_HEADER 63 return (
static_cast<std::underlying_type_t<socket_event_flag>
>(lhs) &
static_cast<std::underlying_type_t<socket_event_flag>
>(rhs)) != 0;
67 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));
103 socket_event_source*
const root_{};
107 struct socket_event_type;
134 struct hostaddress_event_type{};
176 int set_buffer_sizes(
int size_receive,
int size_send);
179 address_type address_family()
const;
186 std::string local_ip(
bool strip_zone_index =
false)
const;
193 int local_port(
int& error)
const;
195 static std::string address_to_string(sockaddr
const* addr,
int addr_len,
bool with_port =
true,
bool strip_zone_index =
false);
196 static std::string address_to_string(
char const* buf,
int buf_len);
203 bool bind(std::string
const& address);
206 typedef intptr_t socket_t;
208 typedef int socket_t;
212 friend class socket_thread;
225 socket_thread* socket_thread_{};
231 unsigned int port_{};
235 int buffer_sizes_[2];
262 std::swap(fd_, rhs.fd_);
266 socket_base::socket_t detach() {
267 socket_base::socket_t ret = fd_;
272 explicit operator bool()
const {
return fd_ != -1; }
279 std::string peer_ip(
bool strip_zone_index =
false)
const;
286 int peer_port(
int& error)
const;
289 socket_base::socket_t fd_{-1};
302 friend class socket_thread;
317 int listen(address_type family,
int port = 0);
320 std::unique_ptr<socket> accept(
int& error,
fz::event_handler * handler =
nullptr);
378 virtual int read(
void*
buffer,
unsigned int size,
int& error) = 0;
379 virtual int write(
void const*
buffer,
unsigned int size,
int& error) = 0;
381 template<
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
389 return read(
buffer, static_cast<unsigned int>(size), error);
391 template<
typename T, std::enable_if_t<std::is_
unsigned_v<T> && (sizeof(T) > sizeof(
unsigned int)),
int> = 0>
394 if (size > std::numeric_limits<unsigned int>::max()) {
395 size = std::numeric_limits<unsigned int>::max();
397 return read(
buffer, static_cast<unsigned int>(size), error);
400 template<
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
408 return write(
buffer,
static_cast<std::make_unsigned_t<T>
>(size), error);
410 template<
typename T, std::enable_if_t<std::is_
unsigned_v<T> && (sizeof(T) > sizeof(
unsigned int)),
int> = 0>
413 if (size > std::numeric_limits<unsigned int>::max()) {
414 size = std::numeric_limits<unsigned int>::max();
416 return write(
buffer, static_cast<unsigned int>(size), error);
422 virtual int peer_port(
int& error)
const = 0;
424 virtual int connect(
native_string const& host,
unsigned int port, address_type family = address_type::unknown) = 0;
438 virtual int shutdown() = 0;
441 virtual int shutdown_read() = 0;
461 friend class socket_thread;
472 bool is_connected()
const {
490 virtual int connect(
native_string const& host,
unsigned int port, address_type family = address_type::unknown)
override;
507 virtual int read(
void *
buffer,
unsigned int size,
int& error)
override;
524 virtual int write(
void const*
buffer,
unsigned int size,
int& error)
override;
531 std::string peer_ip(
bool strip_zone_index =
false)
const;
541 virtual int peer_port(
int& error)
const override;
549 int ideal_send_buffer_size();
551 virtual int shutdown()
override;
573 flag_keepalive = 0x02
576 int flags()
const {
return flags_; }
579 void set_flags(
int flags,
bool enable);
582 void set_flags(
int flags);
589 void set_keepalive_interval(duration
const& d);
593 socket_t get_descriptor();
611 int send_fd(
fz::buffer & buf,
int fd,
int & error);
622 int read_fd(
fz::buffer & buf,
int &fd,
int & error);
675 virtual int peer_port(
int& error)
const override {
return next_layer_.peer_port(error); }
701 virtual int shutdown_read()
override;
703 virtual int connect(
native_string const& host,
unsigned int port, address_type family = address_type::unknown)
override {
704 return next_layer_.connect(host, port, family);
708 return next_layer_.shutdown();
712 return next_layer_.get_state();
721 void forward_socket_event(socket_event_source* source,
socket_event_flag t,
int error);
728 void forward_hostaddress_event(socket_event_source* source, std::string
const& address);
736 event_handler* event_handler_{};
737 socket_interface& next_layer_;
738 bool event_passthrough_{};
760 class FZ_PRIVATE_SYMBOL winsock_initializer final
763 winsock_initializer();
764 ~winsock_initializer();
771 #define EISCONN WSAEISCONN 774 #define EINPROGRESS WSAEINPROGRESS 777 #define EAFNOSUPPORT WSAEAFNOSUPPORT 780 #define EADDRINUSE WSAEADDRINUSE 783 #define ENOBUFS WSAENOBUFS 785 #ifndef EPROTONOSUPPORT 786 #define EPROTONOSUPPORT WSAEPROTONOSUPPORT 789 #define EALREADY WSAEALREADY 792 #define ECONNREFUSED WSAECONNREFUSED 795 #define ENOTSOCK WSAENOTSOCK 798 #define ETIMEDOUT WSAETIMEDOUT 801 #define ENETUNREACH WSAENETUNREACH 804 #define EHOSTUNREACH WSAEHOSTUNREACH 807 #define ENOTCONN WSAENOTCONN 810 #define ENETRESET WSAENETRESET 813 #define EOPNOTSUPP WSAEOPNOTSUPP 816 #define ESHUTDOWN WSAESHUTDOWN 819 #define EMSGSIZE WSAEMSGSIZE 822 #define ECONNABORTED WSAECONNABORTED 825 #define ECONNRESET WSAECONNRESET 828 #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.
Data has become available.
std::string socket_error_string(int error)
Gets a symbolic name for socket errors.
A simple scoped lock.
Definition: mutex.hpp:92
Interface for sockets.
Definition: socket.hpp:372
Lightweight holder for socket descriptors.
Definition: socket.hpp:250
simple_event< socket_event_type, socket_event_source *, socket_event_flag, int > socket_event
Definition: socket.hpp:107
virtual int shutdown_read() override
Definition: socket.hpp:591
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:678
Declares the event_handler class.
Socket has failed. Further events disabled.
Common base clase for fz::socket and fz::listen_socket.
Definition: socket.hpp:166
Simple Listen socket.
Definition: socket.hpp:299
Various functions to deal with IP address strings.
Socket has been closed. Further events disabled.
This is the recommended event class.
Definition: event.hpp:67
simple_event< hostaddress_event_type, socket_event_source *, std::string > hostaddress_event
Definition: socket.hpp:139
IPv6 capable, non-blocking socket class.
Definition: socket.hpp:459
virtual int shutdown() override
Signals peers that we want to close the connections.
Definition: socket.hpp:707
socket_event_source * root() const
Gets the root source.
Definition: socket.hpp:93
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:651
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:340
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:240
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.
How the socket is initially.
All classes sending socket events should derive from this.
Definition: socket.hpp:84
The duration class represents a time interval in milliseconds.
Definition: time.hpp:290
Sets some global macros and further includes string.hpp.
How the socket is initially.
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:63
virtual native_string peer_host() const override
Definition: socket.hpp:668
virtual int peer_port(int &error) const override
Definition: socket.hpp:675
socket_event_flag
The type of a socket event.
Definition: socket.hpp:34