address.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #pragma once
  2. #include "ip.h"
  3. #include "socket.h"
  4. #include <util/generic/ptr.h>
  5. #include <util/generic/string.h>
  6. namespace NAddr {
  7. class IRemoteAddr {
  8. public:
  9. virtual ~IRemoteAddr() = default;
  10. virtual const sockaddr* Addr() const = 0;
  11. virtual socklen_t Len() const = 0;
  12. };
  13. using IRemoteAddrPtr = THolder<IRemoteAddr>;
  14. using IRemoteAddrRef = TAtomicSharedPtr<NAddr::IRemoteAddr>;
  15. IRemoteAddrPtr GetSockAddr(SOCKET s);
  16. IRemoteAddrPtr GetPeerAddr(SOCKET s);
  17. void PrintHost(IOutputStream& out, const IRemoteAddr& addr);
  18. TString PrintHost(const IRemoteAddr& addr);
  19. TString PrintHostAndPort(const IRemoteAddr& addr);
  20. bool IsLoopback(const IRemoteAddr& addr);
  21. bool IsSame(const IRemoteAddr& lhs, const IRemoteAddr& rhs);
  22. socklen_t SockAddrLength(const sockaddr* addr);
  23. //for accept, recvfrom - see LenPtr()
  24. class TOpaqueAddr: public IRemoteAddr {
  25. public:
  26. inline TOpaqueAddr() noexcept
  27. : L_(sizeof(S_))
  28. {
  29. Zero(S_);
  30. }
  31. inline TOpaqueAddr(const IRemoteAddr* addr) noexcept {
  32. Assign(addr->Addr(), addr->Len());
  33. }
  34. inline TOpaqueAddr(const sockaddr* addr) {
  35. Assign(addr, SockAddrLength(addr));
  36. }
  37. const sockaddr* Addr() const override {
  38. return MutableAddr();
  39. }
  40. socklen_t Len() const override {
  41. return L_;
  42. }
  43. inline sockaddr* MutableAddr() const noexcept {
  44. return (sockaddr*)&S_;
  45. }
  46. inline socklen_t* LenPtr() noexcept {
  47. return &L_;
  48. }
  49. private:
  50. inline void Assign(const sockaddr* addr, socklen_t len) noexcept {
  51. L_ = len;
  52. memcpy(MutableAddr(), addr, L_);
  53. }
  54. private:
  55. sockaddr_storage S_;
  56. socklen_t L_;
  57. };
  58. //for TNetworkAddress
  59. class TAddrInfo: public IRemoteAddr {
  60. public:
  61. inline TAddrInfo(const addrinfo* ai) noexcept
  62. : AI_(ai)
  63. {
  64. }
  65. const sockaddr* Addr() const override {
  66. return AI_->ai_addr;
  67. }
  68. socklen_t Len() const override {
  69. return (socklen_t)AI_->ai_addrlen;
  70. }
  71. private:
  72. const addrinfo* const AI_;
  73. };
  74. //compat, for TIpAddress
  75. class TIPv4Addr: public IRemoteAddr {
  76. public:
  77. inline TIPv4Addr(const TIpAddress& addr) noexcept
  78. : A_(addr)
  79. {
  80. }
  81. const sockaddr* Addr() const override {
  82. return A_;
  83. }
  84. socklen_t Len() const override {
  85. return A_;
  86. }
  87. private:
  88. const TIpAddress A_;
  89. };
  90. //same, for ipv6 addresses
  91. class TIPv6Addr: public IRemoteAddr {
  92. public:
  93. inline TIPv6Addr(const sockaddr_in6& a) noexcept
  94. : A_(a)
  95. {
  96. }
  97. const sockaddr* Addr() const override {
  98. return (sockaddr*)&A_;
  99. }
  100. socklen_t Len() const override {
  101. return sizeof(A_);
  102. }
  103. private:
  104. const sockaddr_in6 A_;
  105. };
  106. }