Cogs.Foundation
Loading...
Searching...
No Matches
Address.h
Go to the documentation of this file.
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 */
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 */
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 */
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 */
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 */
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 */
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
#define COGSFOUNDATION_API
Definition: FoundationBase.h:31
Definition: Address.h:67
virtual bool is_multicast() const override
Definition: Address.h:75
AddrIn6()
Definition: Address.h:69
virtual Family family() const override
Definition: Address.h:73
uint8_t operator[](size_t i) const
Definition: Address.h:76
in6_addr addr
Definition: Address.h:78
AddrIn6(in6_addr addr)
Definition: Address.h:70
Definition: Address.h:39
virtual Family family() const override
Definition: Address.h:55
virtual bool is_multicast() const override
Definition: Address.h:57
uint8_t operator[](size_t i) const
Definition: Address.h:58
AddrIn(uint8_t ip[4])
Definition: Address.h:43
AddrIn(in_addr addr)
Definition: Address.h:42
AddrIn()
Definition: Address.h:41
in_addr addr
Definition: Address.h:61
AddrIn(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
Definition: Address.h:48
AddrIn(uint32_t ip)
Definition: Address.h:44
Definition: Address.h:29
virtual std::string string() const =0
virtual bool is_multicast() const =0
virtual Family family() const =0
Definition: Address.h:121
virtual int size() const override
Definition: Address.h:131
virtual sockaddr * getPtr() override
Definition: Address.h:129
virtual uint16_t port() const override
Definition: Address.h:128
SockaddrIn6()
Definition: Address.h:123
SockaddrIn6(sockaddr_in6 addr)
Definition: Address.h:124
sockaddr_in6 addr
Definition: Address.h:133
virtual Family family() const override
Definition: Address.h:126
AddrIn6 ip() const
Definition: Address.h:127
virtual const sockaddr * getPtr() const override
Definition: Address.h:130
Definition: Address.h:96
virtual Family family() const override
Definition: Address.h:108
virtual const sockaddr * getPtr() const override
Definition: Address.h:112
virtual sockaddr * getPtr() override
Definition: Address.h:111
virtual uint16_t port() const override
Definition: Address.h:110
sockaddr_in addr
Definition: Address.h:115
SockaddrIn()
Definition: Address.h:98
AddrIn ip() const
Definition: Address.h:109
SockaddrIn(AddrIn ip, uint16_t port)
Definition: Address.h:100
SockaddrIn(sockaddr_in addr)
Definition: Address.h:99
virtual int size() const override
Definition: Address.h:113
Definition: Address.h:84
virtual const sockaddr * getPtr() const =0
virtual sockaddr * getPtr()=0
virtual uint16_t port() const =0
virtual int size() const =0
virtual Family family() const =0
Definition: Adapter.cpp:26
sa_family_t Family
Definition: Address.h:23