// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include "common/common_types.h" #include "core/internal_network/network.h" // TODO: C++20 Replace std::vector usages with std::span namespace Network { struct ProxyPacket; class SocketBase { public: #ifndef _WIN32 using SOCKET = int; static constexpr SOCKET INVALID_SOCKET = -1; static constexpr SOCKET SOCKET_ERROR = -1; #endif struct AcceptResult { std::unique_ptr socket; Network::SockAddrIn sockaddr_in; }; SocketBase() = default; explicit SocketBase(SOCKET fd_) : fd{fd_} {} virtual ~SocketBase() = default; YUZU_NON_COPYABLE(SocketBase); YUZU_NON_MOVEABLE(SocketBase); virtual Errno Initialize(Domain domain, Type type, Protocol protocol) = 0; virtual Errno Close() = 0; virtual std::pair Accept() = 0; virtual Errno Connect(Network::SockAddrIn addr_in) = 0; virtual std::pair GetPeerName() = 0; virtual std::pair GetSockName() = 0; virtual Errno Bind(Network::SockAddrIn addr) = 0; virtual Errno Listen(s32 backlog) = 0; virtual Errno Shutdown(ShutdownHow how) = 0; virtual std::pair Recv(int flags, std::span message) = 0; virtual std::pair RecvFrom(int flags, std::span message, Network::SockAddrIn* addr) = 0; virtual std::pair Send(std::span message, int flags) = 0; virtual std::pair SendTo(u32 flags, std::span message, const Network::SockAddrIn* addr) = 0; virtual Errno SetNonBlock(bool enable) = 0; virtual Errno SetSockOpt(SOCKET fd, Network::SocketLevel level, Network::OptName option, std::span value) = 0; virtual std::pair GetPendingError() = 0; virtual bool IsOpened() const = 0; virtual void HandleProxyPacket(const ProxyPacket& packet) = 0; [[nodiscard]] SOCKET GetFD() const { return fd; } SOCKET fd = INVALID_SOCKET; }; class Socket : public SocketBase { public: Socket() = default; explicit Socket(SOCKET fd_) : SocketBase{fd_} {} ~Socket() override; Socket(Socket&& rhs) noexcept; Errno Initialize(Domain domain, Type type, Protocol protocol) override; Errno Close() override; std::pair Accept() override; Errno Connect(Network::SockAddrIn addr_in) override; std::pair GetPeerName() override; std::pair GetSockName() override; Errno Bind(Network::SockAddrIn addr) override; Errno Listen(s32 backlog) override; Errno Shutdown(ShutdownHow how) override; std::pair Recv(int flags, std::span message) override; std::pair RecvFrom(int flags, std::span message, Network::SockAddrIn* addr) override; std::pair Send(std::span message, int flags) override; std::pair SendTo(u32 flags, std::span message, const Network::SockAddrIn* addr) override; Errno SetNonBlock(bool enable) override; Errno SetSockOpt(SOCKET fd, Network::SocketLevel level, Network::OptName option, std::span value) override; std::pair GetPendingError() override; template std::pair GetSockOpt(SOCKET fd, int option); bool IsOpened() const override; void HandleProxyPacket(const ProxyPacket& packet) override; private: bool is_non_blocking = false; }; std::pair Poll(std::span poll_fds, s32 timeout); } // namespace Network