Cogs.Core
Address.h
1#pragma once
2
3#if !defined( EMSCRIPTEN )
4
5#include "../FoundationBase.h"
6
7#include <cstdint>
8#include <cstring>
9#include <string>
10
11#if defined( _WIN32 )
12 #include <Ws2tcpip.h>
13 #undef GetObject
14#else
15 #include <netinet/ip.h>
16#endif
17
18namespace Cogs::Network{
19
20#ifdef _WIN32
21 typedef ADDRESS_FAMILY Family;
22#else
23 typedef sa_family_t Family;
24#endif
25
26 /*
27 * Addr / IP
28 */
29 class COGSFOUNDATION_API Addr{
30 public:
31 virtual Family family() const = 0;
32 virtual std::string string() const = 0;
33 virtual bool is_multicast() const = 0;
34 };
35
36 /*
37 * Addr IPv4
38 */
39 class COGSFOUNDATION_API AddrIn: public Addr{
40 public:
41 AddrIn(): addr({}) {}
42 AddrIn(in_addr addr): addr(addr) {}
43 AddrIn(uint8_t ip[4]) : AddrIn(ip[0], ip[1], ip[2], ip[3]) {}
44 AddrIn(uint32_t ip)
45 {
46 addr.s_addr = htonl(ip);
47 }
48 AddrIn(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
49 {
50 addr.s_addr = htonl((uint32_t)a<<24 | (uint32_t)b<<16 | (uint32_t)c<<8 | (uint32_t)d<<0);
51 }
52 AddrIn(const char* str);
53 AddrIn(const std::string& str);
54
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)); }
60
61 in_addr addr;
62 };
63
64 /*
65 * Addr IPv6
66 */
67 class COGSFOUNDATION_API AddrIn6: public Addr{
68 public:
69 AddrIn6(): addr({}) { }
70 AddrIn6(in6_addr addr): addr(addr) { }
71 AddrIn6(const char *str);
72
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]; }
77
78 in6_addr addr;
79 };
80
81 /*
82 * Sockaddr / IP + Port
83 */
84 class COGSFOUNDATION_API Sockaddr{
85 public:
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;
91 };
92
93 /*
94 * Sockaddr IPv4
95 */
96 class COGSFOUNDATION_API SockaddrIn: public Sockaddr{
97 public:
98 SockaddrIn(): addr({}) { addr.sin_family = family(); }
99 SockaddrIn(sockaddr_in addr): addr(addr) {}
100 SockaddrIn(AddrIn ip, uint16_t port)
101 {
102 addr = {};
103 addr.sin_family = family();
104 addr.sin_port = htons(port);
105 addr.sin_addr = ip.addr;
106 }
107
108 virtual Family family() const override { return AF_INET; }
109 AddrIn ip() const { return AddrIn(addr.sin_addr); }
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); }
114
115 sockaddr_in addr;
116 };
117
118 /*
119 * Sockaddr IPv6
120 */
121 class COGSFOUNDATION_API SockaddrIn6: public Sockaddr{
122 public:
123 SockaddrIn6(): addr({}) { addr.sin6_family = family(); }
124 SockaddrIn6(sockaddr_in6 addr): addr(addr) {}
125
126 virtual Family family() const override { return AF_INET6; }
127 AddrIn6 ip() const { return AddrIn6(addr.sin6_addr); }
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); }
132
133 sockaddr_in6 addr;
134 };
135
136}// namespace ...
137
138#endif