sockets.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <map>
  5. #include <memory>
  6. #include <span>
  7. #include <utility>
  8. #if defined(_WIN32)
  9. #elif !YUZU_UNIX
  10. #error "Platform not implemented"
  11. #endif
  12. #include "common/common_types.h"
  13. #include "core/internal_network/network.h"
  14. #include "network/network.h"
  15. // TODO: C++20 Replace std::vector usages with std::span
  16. namespace Network {
  17. class SocketBase {
  18. public:
  19. #ifdef YUZU_UNIX
  20. using SOCKET = int;
  21. static constexpr SOCKET INVALID_SOCKET = -1;
  22. static constexpr SOCKET SOCKET_ERROR = -1;
  23. #endif
  24. struct AcceptResult {
  25. std::unique_ptr<SocketBase> socket;
  26. SockAddrIn sockaddr_in;
  27. };
  28. SocketBase() = default;
  29. explicit SocketBase(SOCKET fd_) : fd{fd_} {}
  30. virtual ~SocketBase() = default;
  31. virtual SocketBase& operator=(const SocketBase&) = delete;
  32. // Avoid closing sockets implicitly
  33. virtual SocketBase& operator=(SocketBase&&) noexcept = delete;
  34. virtual Errno Initialize(Domain domain, Type type, Protocol protocol) = 0;
  35. virtual Errno Close() = 0;
  36. virtual std::pair<AcceptResult, Errno> Accept() = 0;
  37. virtual Errno Connect(SockAddrIn addr_in) = 0;
  38. virtual std::pair<SockAddrIn, Errno> GetPeerName() = 0;
  39. virtual std::pair<SockAddrIn, Errno> GetSockName() = 0;
  40. virtual Errno Bind(SockAddrIn addr) = 0;
  41. virtual Errno Listen(s32 backlog) = 0;
  42. virtual Errno Shutdown(ShutdownHow how) = 0;
  43. virtual std::pair<s32, Errno> Recv(int flags, std::vector<u8>& message) = 0;
  44. virtual std::pair<s32, Errno> RecvFrom(int flags, std::vector<u8>& message,
  45. SockAddrIn* addr) = 0;
  46. virtual std::pair<s32, Errno> Send(std::span<const u8> message, int flags) = 0;
  47. virtual std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message,
  48. const SockAddrIn* addr) = 0;
  49. virtual Errno SetLinger(bool enable, u32 linger) = 0;
  50. virtual Errno SetReuseAddr(bool enable) = 0;
  51. virtual Errno SetKeepAlive(bool enable) = 0;
  52. virtual Errno SetBroadcast(bool enable) = 0;
  53. virtual Errno SetSndBuf(u32 value) = 0;
  54. virtual Errno SetRcvBuf(u32 value) = 0;
  55. virtual Errno SetSndTimeo(u32 value) = 0;
  56. virtual Errno SetRcvTimeo(u32 value) = 0;
  57. virtual Errno SetNonBlock(bool enable) = 0;
  58. virtual bool IsOpened() const = 0;
  59. virtual void HandleProxyPacket(const ProxyPacket& packet) = 0;
  60. [[nodiscard]] SOCKET GetFD() const {
  61. return fd;
  62. }
  63. protected:
  64. SOCKET fd = INVALID_SOCKET;
  65. };
  66. class Socket : public SocketBase {
  67. public:
  68. Socket() = default;
  69. explicit Socket(SOCKET fd_) : SocketBase{fd_} {}
  70. ~Socket() override;
  71. Socket(const Socket&) = delete;
  72. Socket& operator=(const Socket&) = delete;
  73. Socket(Socket&& rhs) noexcept;
  74. // Avoid closing sockets implicitly
  75. Socket& operator=(Socket&&) noexcept = delete;
  76. Errno Initialize(Domain domain, Type type, Protocol protocol) override;
  77. Errno Close() override;
  78. std::pair<AcceptResult, Errno> Accept() override;
  79. Errno Connect(SockAddrIn addr_in) override;
  80. std::pair<SockAddrIn, Errno> GetPeerName() override;
  81. std::pair<SockAddrIn, Errno> GetSockName() override;
  82. Errno Bind(SockAddrIn addr) override;
  83. Errno Listen(s32 backlog) override;
  84. Errno Shutdown(ShutdownHow how) override;
  85. std::pair<s32, Errno> Recv(int flags, std::vector<u8>& message) override;
  86. std::pair<s32, Errno> RecvFrom(int flags, std::vector<u8>& message, SockAddrIn* addr) override;
  87. std::pair<s32, Errno> Send(std::span<const u8> message, int flags) override;
  88. std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message,
  89. const SockAddrIn* addr) override;
  90. Errno SetLinger(bool enable, u32 linger) override;
  91. Errno SetReuseAddr(bool enable) override;
  92. Errno SetKeepAlive(bool enable) override;
  93. Errno SetBroadcast(bool enable) override;
  94. Errno SetSndBuf(u32 value) override;
  95. Errno SetRcvBuf(u32 value) override;
  96. Errno SetSndTimeo(u32 value) override;
  97. Errno SetRcvTimeo(u32 value) override;
  98. Errno SetNonBlock(bool enable) override;
  99. template <typename T>
  100. Errno SetSockOpt(SOCKET fd, int option, T value);
  101. bool IsOpened() const override;
  102. void HandleProxyPacket(const ProxyPacket& packet) override;
  103. };
  104. std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout);
  105. } // namespace Network