3#if !defined( EMSCRIPTEN )
5#include "../FoundationBase.h"
15 #include <netinet/ip.h>
18namespace Cogs::Network{
21 typedef ADDRESS_FAMILY Family;
23 typedef sa_family_t Family;
29 class COGSFOUNDATION_API
Addr{
31 virtual Family family()
const = 0;
32 virtual std::string string()
const = 0;
33 virtual bool is_multicast()
const = 0;
42 AddrIn(in_addr addr): addr(addr) {}
43 AddrIn(uint8_t ip[4]) :
AddrIn(ip[0], ip[1], ip[2], ip[3]) {}
46 addr.s_addr = htonl(ip);
48 AddrIn(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
50 addr.s_addr = htonl((uint32_t)a<<24 | (uint32_t)b<<16 | (uint32_t)c<<8 | (uint32_t)d<<0);
53 AddrIn(
const std::string& str);
55 virtual Family family()
const override {
return AF_INET; }
56 virtual std::string string()
const override;
57 virtual bool is_multicast()
const override {
return (addr.s_addr&0xf0u) == 0xe0u; }
58 uint8_t operator[](
size_t i)
const {
return (addr.s_addr>>(i*8))&0xffu;}
59 bool operator ==(
const AddrIn& rhs)
const {
return !std::memcmp(&addr, &rhs.addr,
sizeof(addr)); }
70 AddrIn6(in6_addr addr): addr(addr) { }
73 virtual Family family()
const override {
return AF_INET6; }
74 virtual std::string string()
const override;
75 virtual bool is_multicast()
const override {
return addr.s6_addr[0] == 0xffu; }
76 uint8_t operator[](
size_t i)
const {
return addr.s6_addr[i]; }
86 virtual Family family()
const = 0;
87 virtual uint16_t port()
const = 0;
88 virtual sockaddr *getPtr() = 0;
89 virtual const sockaddr *getPtr()
const = 0;
90 virtual int size()
const = 0;
98 SockaddrIn(): addr({}) { addr.sin_family = family(); }
103 addr.sin_family = family();
104 addr.sin_port = htons(port);
105 addr.sin_addr = ip.addr;
108 virtual Family family()
const override {
return AF_INET; }
110 virtual uint16_t port()
const override {
return ntohs(addr.sin_port); }
111 virtual sockaddr *getPtr()
override {
return reinterpret_cast<sockaddr*
>(&addr); }
112 virtual const sockaddr *getPtr()
const override {
return reinterpret_cast<const sockaddr *
>(&addr); }
113 virtual int size()
const override {
return sizeof(addr); }
123 SockaddrIn6(): addr({}) { addr.sin6_family = family(); }
126 virtual Family family()
const override {
return AF_INET6; }
128 virtual uint16_t port()
const override {
return ntohs(addr.sin6_port); }
129 virtual sockaddr *getPtr()
override {
return reinterpret_cast<sockaddr*
>(&addr); }
130 virtual const sockaddr *getPtr()
const override {
return reinterpret_cast<const sockaddr *
>(&addr); }
131 virtual int size()
const override {
return sizeof(addr); }