// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PLATFORM_IMPL_STREAM_SOCKET_POSIX_H_ #define PLATFORM_IMPL_STREAM_SOCKET_POSIX_H_ #include #include #include #include "absl/types/optional.h" #include "platform/base/error.h" #include "platform/base/ip_address.h" #include "platform/impl/socket_address_posix.h" #include "platform/impl/socket_handle_posix.h" #include "platform/impl/stream_socket.h" #include "util/weak_ptr.h" namespace openscreen { class StreamSocketPosix : public StreamSocket { public: explicit StreamSocketPosix(IPAddress::Version version); explicit StreamSocketPosix(const IPEndpoint& local_endpoint); StreamSocketPosix(SocketAddressPosix local_address, IPEndpoint remote_address, int file_descriptor); // StreamSocketPosix is non-copyable, due to directly managing the file // descriptor. StreamSocketPosix(const StreamSocketPosix& other) = delete; StreamSocketPosix(StreamSocketPosix&& other) noexcept; StreamSocketPosix& operator=(const StreamSocketPosix& other) = delete; StreamSocketPosix& operator=(StreamSocketPosix&& other); virtual ~StreamSocketPosix(); WeakPtr GetWeakPtr() const; // StreamSocket overrides. ErrorOr> Accept() override; Error Bind() override; Error Close() override; Error Connect(const IPEndpoint& remote_endpoint) override; Error Listen() override; Error Listen(int max_backlog_size) override; // StreamSocket getter overrides. const SocketHandle& socket_handle() const override { return handle_; } absl::optional remote_address() const override; absl::optional local_address() const override; TcpSocketState state() const override; IPAddress::Version version() const override; private: // StreamSocketPosix is lazy initialized on first usage. For simplicitly, // the ensure method returns a boolean of whether or not the socket was // initialized successfully. bool EnsureInitializedAndOpen(); Error Initialize(); Error CloseOnError(Error error); Error ReportSocketClosedError(); constexpr static int kUnsetHandleFd = -1; // This SocketHandle object is expected to persist for the lieftime of this // object. The internal fd may change, but the object may not be destroyed. SocketHandle handle_{kUnsetHandleFd}; // last_error_code_ is an Error::Code instead of an Error so it meets // atomic's (trivially) copyable and moveable requirements. Error::Code last_error_code_ = Error::Code::kNone; IPAddress::Version version_; absl::optional local_address_; absl::optional remote_address_; bool is_bound_ = false; TcpSocketState state_ = TcpSocketState::kNotConnected; WeakPtrFactory weak_factory_{this}; }; } // namespace openscreen #endif // PLATFORM_IMPL_STREAM_SOCKET_POSIX_H_