CSocketAddress.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. #include <AK/IPv4Address.h>
  3. #include <arpa/inet.h>
  4. #include <sys/socket.h>
  5. #include <sys/un.h>
  6. class CSocketAddress {
  7. public:
  8. enum class Type {
  9. Invalid,
  10. IPv4,
  11. Local
  12. };
  13. CSocketAddress() {}
  14. CSocketAddress(const IPv4Address& address)
  15. : m_type(Type::IPv4)
  16. , m_ipv4_address(address)
  17. {
  18. }
  19. CSocketAddress(const IPv4Address& address, u16 port)
  20. : m_type(Type::IPv4)
  21. , m_ipv4_address(address)
  22. , m_port(port)
  23. {
  24. }
  25. static CSocketAddress local(const String& address)
  26. {
  27. CSocketAddress addr;
  28. addr.m_type = Type::Local;
  29. addr.m_local_address = address;
  30. return addr;
  31. }
  32. Type type() const { return m_type; }
  33. bool is_valid() const { return m_type != Type::Invalid; }
  34. IPv4Address ipv4_address() const { return m_ipv4_address; }
  35. u16 port() const { return m_port; }
  36. String to_string() const
  37. {
  38. switch (m_type) {
  39. case Type::IPv4:
  40. return String::format("%s:%d", m_ipv4_address.to_string().characters(), m_port);
  41. case Type::Local:
  42. return m_local_address;
  43. default:
  44. return "[CSocketAddress]";
  45. }
  46. }
  47. sockaddr_un to_sockaddr_un() const
  48. {
  49. ASSERT(type() == Type::Local);
  50. sockaddr_un address;
  51. address.sun_family = AF_LOCAL;
  52. RELEASE_ASSERT(m_local_address.length() < (int)sizeof(address.sun_path));
  53. strcpy(address.sun_path, m_local_address.characters());
  54. return address;
  55. }
  56. sockaddr_in to_sockaddr_in() const
  57. {
  58. ASSERT(type() == Type::IPv4);
  59. sockaddr_in address;
  60. address.sin_family = AF_INET;
  61. address.sin_addr.s_addr = m_ipv4_address.to_in_addr_t();
  62. address.sin_port = htons(m_port);
  63. return address;
  64. }
  65. private:
  66. Type m_type { Type::Invalid };
  67. IPv4Address m_ipv4_address;
  68. u16 m_port { 0 };
  69. String m_local_address;
  70. };
  71. inline const LogStream& operator<<(const LogStream& stream, const CSocketAddress& value)
  72. {
  73. return stream << value.to_string();
  74. }