blob: 9cfbd06fd30171e45a6c52b1fec501f70491ad64 [file] [log] [blame] [edit]
// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_COMMON_QUICHE_SOCKET_ADDRESS_H_
#define QUICHE_COMMON_QUICHE_SOCKET_ADDRESS_H_
#include <string>
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/quiche_ip_address.h"
namespace quiche {
// A class representing a socket endpoint address (i.e., IP address plus a
// port).
class QUICHE_EXPORT QuicheSocketAddress {
public:
QuicheSocketAddress() {}
QuicheSocketAddress(QuicheIpAddress address, uint16_t port);
explicit QuicheSocketAddress(const struct sockaddr_storage& saddr);
explicit QuicheSocketAddress(const sockaddr* saddr, socklen_t len);
QuicheSocketAddress(const QuicheSocketAddress& other) = default;
QuicheSocketAddress& operator=(const QuicheSocketAddress& other) = default;
QuicheSocketAddress& operator=(QuicheSocketAddress&& other) = default;
QUICHE_EXPORT friend bool operator==(const QuicheSocketAddress& lhs,
const QuicheSocketAddress& rhs);
QUICHE_EXPORT friend bool operator!=(const QuicheSocketAddress& lhs,
const QuicheSocketAddress& rhs);
bool IsInitialized() const;
std::string ToString() const;
// TODO(ericorth): Convert usage over to socket_api::GetSocketAddress() and
// remove.
int FromSocket(int fd);
QuicheSocketAddress Normalized() const;
QuicheIpAddress host() const;
uint16_t port() const;
sockaddr_storage generic_address() const;
// Hashes this address to an uint32_t.
uint32_t Hash() const;
private:
QuicheIpAddress host_;
uint16_t port_ = 0;
};
inline std::ostream& operator<<(std::ostream& os,
const QuicheSocketAddress address) {
os << address.ToString();
return os;
}
// clang-format off
class QUICHE_EXPORT QuicheSocketAddressHash {
public:
size_t operator()(QuicheSocketAddress const& address) const noexcept {
return address.Hash();
}
};
// clang-format on
} // namespace quiche
#endif // QUICHE_COMMON_QUICHE_SOCKET_ADDRESS_H_