network.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <optional>
  6. #include "common/common_funcs.h"
  7. #include "common/common_types.h"
  8. #include "common/socket_types.h"
  9. #ifdef _WIN32
  10. #include <winsock2.h>
  11. #elif YUZU_UNIX
  12. #include <netinet/in.h>
  13. #endif
  14. namespace Network {
  15. class SocketBase;
  16. class Socket;
  17. /// Error code for network functions
  18. enum class Errno {
  19. SUCCESS,
  20. BADF,
  21. INVAL,
  22. MFILE,
  23. NOTCONN,
  24. AGAIN,
  25. CONNREFUSED,
  26. CONNRESET,
  27. HOSTUNREACH,
  28. NETDOWN,
  29. NETUNREACH,
  30. TIMEDOUT,
  31. MSGSIZE,
  32. OTHER,
  33. };
  34. /// Cross-platform poll fd structure
  35. enum class PollEvents : u16 {
  36. // Using Pascal case because IN is a macro on Windows.
  37. In = 1 << 0,
  38. Pri = 1 << 1,
  39. Out = 1 << 2,
  40. Err = 1 << 3,
  41. Hup = 1 << 4,
  42. Nval = 1 << 5,
  43. };
  44. DECLARE_ENUM_FLAG_OPERATORS(PollEvents);
  45. struct PollFD {
  46. SocketBase* socket;
  47. PollEvents events;
  48. PollEvents revents;
  49. };
  50. class NetworkInstance {
  51. public:
  52. explicit NetworkInstance();
  53. ~NetworkInstance();
  54. };
  55. #ifdef _WIN32
  56. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  57. auto& bytes = addr.S_un.S_un_b;
  58. return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4};
  59. }
  60. #elif YUZU_UNIX
  61. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  62. const u32 bytes = addr.s_addr;
  63. return IPv4Address{static_cast<u8>(bytes), static_cast<u8>(bytes >> 8),
  64. static_cast<u8>(bytes >> 16), static_cast<u8>(bytes >> 24)};
  65. }
  66. #endif
  67. /// @brief Returns host's IPv4 address
  68. /// @return human ordered IPv4 address (e.g. 192.168.0.1) as an array
  69. std::optional<IPv4Address> GetHostIPv4Address();
  70. } // namespace Network