socket_address.h 2.16 KB
//
//  socket_address.h
//
//  Created by cairui01 on 18/11/9.
//  Copyright (c) 2018年 baidu. All rights reserved.
//
#ifndef SOCKET_ADDRESS_H_
#define SOCKET_ADDRESS_H_

#include "unix_socket.h"

#include <string.h>

namespace apirequest {
namespace sdt {

class socket_address {

  public:
    explicit socket_address(const char* _url);
    explicit socket_address(const char* _ip, uint16_t _port);
    explicit socket_address(const sockaddr_in& _addr);
    explicit socket_address(const sockaddr_in6& _addr);
    explicit socket_address(const sockaddr* _addr);
    explicit socket_address(const struct in_addr& _in_addr);
    explicit socket_address(const struct in6_addr& _in6_addr);

    const sockaddr& address() const;
    socklen_t address_length() const;

    const char* url() const;
    const char* ip() const;
    const char* ipv6() const;
    uint16_t port() const;

    bool valid() const;
    bool valid_server_address(bool _allowloopback = false, bool _ignore_port = false) const;
    bool valid_bind_address() const;
    bool valid_broadcast_address() const;

    bool valid_loopback_ip() const;
    bool valid_broadcast_ip() const;

    bool isv4mapped_address() const;
    socket_address& v4tov4mapped_address();
    
    /// 是否是IPv6地址
    bool isv6() const;
    /// 是否是IPv4地址
    bool isv4() const;
    
    /// 返回IPv4 in结构
    const sockaddr_in& get_sockaddr() const;
    /// 返回IPv6 in6结构
    const sockaddr_in6& get_sockaddr_v6() const;

    bool is_ipport_equal(const socket_address& _sa) const {return 0==strncmp(ip(), _sa.ip(), sizeof(ip_)) && port()==_sa.port();}

    static bool update_nat64_prefix();
  public:
    static socket_address getsockname(SOCKET _sock);
	static socket_address getpeername(SOCKET _sock);

  private:
    //    socket_address(const socket_address&);
    //    const socket_address& operator=(const socket_address&);
    void  __init(const sockaddr*  _addr);

  private:

    union {
        struct sockaddr     sa;
        struct sockaddr_in  in;
        struct sockaddr_in6 in6;
    }                   addr_;
    char                ip_[96];
    char                url_[128];
};
}
}
#endif /* SOCKET_ADDRESS_H_ */