sockets.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. // TODO: C++20 Replace std::vector usages with std::span
  15. namespace Network {
  16. struct ProxyPacket;
  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. YUZU_NON_COPYABLE(SocketBase);
  32. YUZU_NON_MOVEABLE(SocketBase);
  33. virtual Errno Initialize(Domain domain, Type type, Protocol protocol) = 0;
  34. virtual Errno Close() = 0;
  35. virtual std::pair<AcceptResult, Errno> Accept() = 0;
  36. virtual Errno Connect(SockAddrIn addr_in) = 0;
  37. virtual std::pair<SockAddrIn, Errno> GetPeerName() = 0;
  38. virtual std::pair<SockAddrIn, Errno> GetSockName() = 0;
  39. virtual Errno Bind(SockAddrIn addr) = 0;
  40. virtual Errno Listen(s32 backlog) = 0;
  41. virtual Errno Shutdown(ShutdownHow how) = 0;
  42. virtual std::pair<s32, Errno> Recv(int flags, std::span<u8> message) = 0;
  43. virtual std::pair<s32, Errno> RecvFrom(int flags, std::span<u8> message, SockAddrIn* addr) = 0;
  44. virtual std::pair<s32, Errno> Send(std::span<const u8> message, int flags) = 0;
  45. virtual std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message,
  46. const SockAddrIn* addr) = 0;
  47. virtual Errno SetLinger(bool enable, u32 linger) = 0;
  48. virtual Errno SetReuseAddr(bool enable) = 0;
  49. virtual Errno SetKeepAlive(bool enable) = 0;
  50. virtual Errno SetBroadcast(bool enable) = 0;
  51. virtual Errno SetSndBuf(u32 value) = 0;
  52. virtual Errno SetRcvBuf(u32 value) = 0;
  53. virtual Errno SetSndTimeo(u32 value) = 0;
  54. virtual Errno SetRcvTimeo(u32 value) = 0;
  55. virtual Errno SetNonBlock(bool enable) = 0;
  56. virtual std::pair<Errno, Errno> GetPendingError() = 0;
  57. virtual bool IsOpened() const = 0;
  58. virtual void HandleProxyPacket(const ProxyPacket& packet) = 0;
  59. [[nodiscard]] SOCKET GetFD() const {
  60. return fd;
  61. }
  62. protected:
  63. SOCKET fd = INVALID_SOCKET;
  64. };
  65. class Socket : public SocketBase {
  66. public:
  67. Socket() = default;
  68. explicit Socket(SOCKET fd_) : SocketBase{fd_} {}
  69. ~Socket() override;
  70. Socket(Socket&& rhs) noexcept;
  71. Errno Initialize(Domain domain, Type type, Protocol protocol) override;
  72. Errno Close() override;
  73. std::pair<AcceptResult, Errno> Accept() override;
  74. Errno Connect(SockAddrIn addr_in) override;
  75. std::pair<SockAddrIn, Errno> GetPeerName() override;
  76. std::pair<SockAddrIn, Errno> GetSockName() override;
  77. Errno Bind(SockAddrIn addr) override;
  78. Errno Listen(s32 backlog) override;
  79. Errno Shutdown(ShutdownHow how) override;
  80. std::pair<s32, Errno> Recv(int flags, std::span<u8> message) override;
  81. std::pair<s32, Errno> RecvFrom(int flags, std::span<u8> message, SockAddrIn* addr) override;
  82. std::pair<s32, Errno> Send(std::span<const u8> message, int flags) override;
  83. std::pair<s32, Errno> SendTo(u32 flags, std::span<const u8> message,
  84. const SockAddrIn* addr) override;
  85. Errno SetLinger(bool enable, u32 linger) override;
  86. Errno SetReuseAddr(bool enable) override;
  87. Errno SetKeepAlive(bool enable) override;
  88. Errno SetBroadcast(bool enable) override;
  89. Errno SetSndBuf(u32 value) override;
  90. Errno SetRcvBuf(u32 value) override;
  91. Errno SetSndTimeo(u32 value) override;
  92. Errno SetRcvTimeo(u32 value) override;
  93. Errno SetNonBlock(bool enable) override;
  94. template <typename T>
  95. Errno SetSockOpt(SOCKET fd, int option, T value);
  96. std::pair<Errno, Errno> GetPendingError() override;
  97. template <typename T>
  98. std::pair<T, Errno> GetSockOpt(SOCKET fd, int option);
  99. bool IsOpened() const override;
  100. void HandleProxyPacket(const ProxyPacket& packet) override;
  101. };
  102. std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout);
  103. } // namespace Network