Lines 145-151
Link Here
|
145 |
}; |
145 |
}; |
146 |
}; |
146 |
}; |
147 |
|
147 |
|
148 |
// Remeber to set the AF_INET. |
148 |
// Remember to set the AF_INET. |
149 |
|
149 |
|
150 |
class socket_address_inet { |
150 |
class socket_address_inet { |
151 |
public: |
151 |
public: |
Lines 184-189
Link Here
|
184 |
|
184 |
|
185 |
const sockaddr* c_sockaddr() const { return reinterpret_cast<const sockaddr*>(&m_sockaddr); } |
185 |
const sockaddr* c_sockaddr() const { return reinterpret_cast<const sockaddr*>(&m_sockaddr); } |
186 |
const sockaddr_in* c_sockaddr_inet() const { return &m_sockaddr; } |
186 |
const sockaddr_in* c_sockaddr_inet() const { return &m_sockaddr; } |
|
|
187 |
|
188 |
#ifdef RAK_USE_INET6 |
189 |
socket_address_inet6 to_mapped_address() const; |
190 |
#endif |
187 |
|
191 |
|
188 |
bool operator == (const socket_address_inet& rhs) const; |
192 |
bool operator == (const socket_address_inet& rhs) const; |
189 |
bool operator < (const socket_address_inet& rhs) const; |
193 |
bool operator < (const socket_address_inet& rhs) const; |
Lines 192-197
Link Here
|
192 |
struct sockaddr_in m_sockaddr; |
196 |
struct sockaddr_in m_sockaddr; |
193 |
}; |
197 |
}; |
194 |
|
198 |
|
|
|
199 |
#ifdef RAK_USE_INET6 |
200 |
// Remember to set the AF_INET6. |
201 |
|
202 |
class socket_address_inet6 { |
203 |
public: |
204 |
bool is_any() const { return is_port_any() && is_address_any(); } |
205 |
bool is_valid() const { return !is_port_any() && !is_address_any(); } |
206 |
bool is_port_any() const { return port() == 0; } |
207 |
bool is_address_any() const { return std::memcmp(&m_sockaddr.sin6_addr, &in6addr_any, sizeof(in6_addr)) == 0; } |
208 |
|
209 |
void clear() { std::memset(this, 0, sizeof(socket_address_inet6)); set_family(); } |
210 |
|
211 |
uint16_t port() const { return ntohs(m_sockaddr.sin6_port); } |
212 |
uint16_t port_n() const { return m_sockaddr.sin6_port; } |
213 |
void set_port(uint16_t p) { m_sockaddr.sin6_port = htons(p); } |
214 |
void set_port_n(uint16_t p) { m_sockaddr.sin6_port = p; } |
215 |
|
216 |
in6_addr address() const { return m_sockaddr.sin6_addr; } |
217 |
std::string address_str() const; |
218 |
bool address_c_str(char* buf, socklen_t size) const; |
219 |
|
220 |
void set_address(in6_addr a) { m_sockaddr.sin6_addr = a; } |
221 |
bool set_address_str(const std::string& a) { return set_address_c_str(a.c_str()); } |
222 |
bool set_address_c_str(const char* a); |
223 |
|
224 |
void set_address_any() { set_port(0); set_address(in6addr_any); } |
225 |
|
226 |
sa_family_t family() const { return m_sockaddr.sin6_family; } |
227 |
void set_family() { m_sockaddr.sin6_family = AF_INET6; } |
228 |
|
229 |
sockaddr* c_sockaddr() { return reinterpret_cast<sockaddr*>(&m_sockaddr); } |
230 |
sockaddr_in6* c_sockaddr_inet6() { return &m_sockaddr; } |
231 |
|
232 |
const sockaddr* c_sockaddr() const { return reinterpret_cast<const sockaddr*>(&m_sockaddr); } |
233 |
const sockaddr_in6* c_sockaddr_inet6() const { return &m_sockaddr; } |
234 |
|
235 |
socket_address normalize_address() const; |
236 |
|
237 |
bool operator == (const socket_address_inet6& rhs) const; |
238 |
bool operator < (const socket_address_inet6& rhs) const; |
239 |
|
240 |
private: |
241 |
struct sockaddr_in6 m_sockaddr; |
242 |
}; |
243 |
#endif |
244 |
|
195 |
// Unique key for the address, excluding port numbers etc. |
245 |
// Unique key for the address, excluding port numbers etc. |
196 |
class socket_address_key { |
246 |
class socket_address_key { |
197 |
public: |
247 |
public: |
Lines 241-248
Link Here
|
241 |
switch (family()) { |
291 |
switch (family()) { |
242 |
case af_inet: |
292 |
case af_inet: |
243 |
return sa_inet()->is_valid(); |
293 |
return sa_inet()->is_valid(); |
244 |
// case af_inet6: |
294 |
#ifdef RAK_USE_INET6 |
245 |
// return sa_inet6().is_valid(); |
295 |
case af_inet6: |
|
|
296 |
return sa_inet6()->is_valid(); |
297 |
#endif |
246 |
default: |
298 |
default: |
247 |
return false; |
299 |
return false; |
248 |
} |
300 |
} |
Lines 253-258
Link Here
|
253 |
switch (family()) { |
305 |
switch (family()) { |
254 |
case af_inet: |
306 |
case af_inet: |
255 |
return !sa_inet()->is_address_any(); |
307 |
return !sa_inet()->is_address_any(); |
|
|
308 |
#ifdef RAK_USE_INET6 |
309 |
case af_inet6: |
310 |
return !sa_inet6()->is_address_any(); |
311 |
#endif |
256 |
default: |
312 |
default: |
257 |
return false; |
313 |
return false; |
258 |
} |
314 |
} |
Lines 263-268
Link Here
|
263 |
switch (family()) { |
319 |
switch (family()) { |
264 |
case af_inet: |
320 |
case af_inet: |
265 |
return sa_inet()->is_address_any(); |
321 |
return sa_inet()->is_address_any(); |
|
|
322 |
#ifdef RAK_USE_INET6 |
323 |
case af_inet6: |
324 |
return sa_inet6()->is_address_any(); |
325 |
#endif |
266 |
default: |
326 |
default: |
267 |
return true; |
327 |
return true; |
268 |
} |
328 |
} |
Lines 273-278
Link Here
|
273 |
switch (family()) { |
333 |
switch (family()) { |
274 |
case af_inet: |
334 |
case af_inet: |
275 |
return sa_inet()->port(); |
335 |
return sa_inet()->port(); |
|
|
336 |
#ifdef RAK_USE_INET6 |
337 |
case af_inet6: |
338 |
return sa_inet6()->port(); |
339 |
#endif |
276 |
default: |
340 |
default: |
277 |
return 0; |
341 |
return 0; |
278 |
} |
342 |
} |
Lines 283-288
Link Here
|
283 |
switch (family()) { |
347 |
switch (family()) { |
284 |
case af_inet: |
348 |
case af_inet: |
285 |
return sa_inet()->set_port(p); |
349 |
return sa_inet()->set_port(p); |
|
|
350 |
#ifdef RAK_USE_INET6 |
351 |
case af_inet6: |
352 |
return sa_inet6()->set_port(p); |
353 |
#endif |
286 |
default: |
354 |
default: |
287 |
break; |
355 |
break; |
288 |
} |
356 |
} |
Lines 293-298
Link Here
|
293 |
switch (family()) { |
361 |
switch (family()) { |
294 |
case af_inet: |
362 |
case af_inet: |
295 |
return sa_inet()->address_str(); |
363 |
return sa_inet()->address_str(); |
|
|
364 |
#ifdef RAK_USE_INET6 |
365 |
case af_inet6: |
366 |
return sa_inet6()->address_str(); |
367 |
#endif |
296 |
default: |
368 |
default: |
297 |
return std::string(); |
369 |
return std::string(); |
298 |
} |
370 |
} |
Lines 303-308
Link Here
|
303 |
switch (family()) { |
375 |
switch (family()) { |
304 |
case af_inet: |
376 |
case af_inet: |
305 |
return sa_inet()->address_c_str(buf, size); |
377 |
return sa_inet()->address_c_str(buf, size); |
|
|
378 |
#ifdef RAK_USE_INET6 |
379 |
case af_inet6: |
380 |
return sa_inet6()->address_c_str(buf, size); |
381 |
#endif |
306 |
default: |
382 |
default: |
307 |
return false; |
383 |
return false; |
308 |
} |
384 |
} |
Lines 314-319
Link Here
|
314 |
sa_inet()->set_family(); |
390 |
sa_inet()->set_family(); |
315 |
return true; |
391 |
return true; |
316 |
|
392 |
|
|
|
393 |
#ifdef RAK_USE_INET6 |
394 |
} else if (sa_inet6()->set_address_c_str(a)) { |
395 |
sa_inet6()->set_family(); |
396 |
return true; |
397 |
#endif |
398 |
|
317 |
} else { |
399 |
} else { |
318 |
return false; |
400 |
return false; |
319 |
} |
401 |
} |
Lines 325-330
Link Here
|
325 |
switch(family()) { |
407 |
switch(family()) { |
326 |
case af_inet: |
408 |
case af_inet: |
327 |
return sizeof(sockaddr_in); |
409 |
return sizeof(sockaddr_in); |
|
|
410 |
#ifdef RAK_USE_INET6 |
411 |
case af_inet6: |
412 |
return sizeof(sockaddr_in6); |
413 |
#endif |
328 |
default: |
414 |
default: |
329 |
return 0; |
415 |
return 0; |
330 |
} |
416 |
} |
Lines 349-356
Link Here
|
349 |
switch (family()) { |
435 |
switch (family()) { |
350 |
case af_inet: |
436 |
case af_inet: |
351 |
return *sa_inet() == *rhs.sa_inet(); |
437 |
return *sa_inet() == *rhs.sa_inet(); |
352 |
// case af_inet6: |
438 |
#ifdef RAK_USE_INET6 |
353 |
// return *sa_inet6() == *rhs.sa_inet6(); |
439 |
case af_inet6: |
|
|
440 |
return *sa_inet6() == *rhs.sa_inet6(); |
441 |
#endif |
354 |
default: |
442 |
default: |
355 |
throw std::logic_error("socket_address::operator == (rhs) invalid type comparison."); |
443 |
throw std::logic_error("socket_address::operator == (rhs) invalid type comparison."); |
356 |
} |
444 |
} |
Lines 364-371
Link Here
|
364 |
switch (family()) { |
452 |
switch (family()) { |
365 |
case af_inet: |
453 |
case af_inet: |
366 |
return *sa_inet() < *rhs.sa_inet(); |
454 |
return *sa_inet() < *rhs.sa_inet(); |
367 |
// case af_inet6: |
455 |
#ifdef RAK_USE_INET6 |
368 |
// return *sa_inet6() < *rhs.sa_inet6(); |
456 |
case af_inet6: |
|
|
457 |
return *sa_inet6() < *rhs.sa_inet6(); |
458 |
#endif |
369 |
default: |
459 |
default: |
370 |
throw std::logic_error("socket_address::operator < (rhs) invalid type comparison."); |
460 |
throw std::logic_error("socket_address::operator < (rhs) invalid type comparison."); |
371 |
} |
461 |
} |
Lines 391-396
Link Here
|
391 |
return inet_pton(AF_INET, a, &m_sockaddr.sin_addr); |
481 |
return inet_pton(AF_INET, a, &m_sockaddr.sin_addr); |
392 |
} |
482 |
} |
393 |
|
483 |
|
|
|
484 |
#ifdef RAK_USE_INET6 |
485 |
inline socket_address_inet6 |
486 |
socket_address_inet::to_mapped_address() const { |
487 |
uint32_t addr32[4]; |
488 |
addr32[0] = 0; |
489 |
addr32[1] = 0; |
490 |
addr32[2] = htonl(0xffff); |
491 |
addr32[3] = m_sockaddr.sin_addr.s_addr; |
492 |
|
493 |
socket_address_inet6 sa; |
494 |
sa.clear(); |
495 |
sa.set_address(*reinterpret_cast<in6_addr *>(addr32)); |
496 |
sa.set_port_n(m_sockaddr.sin_port); |
497 |
return sa; |
498 |
} |
499 |
#endif |
500 |
|
394 |
inline bool |
501 |
inline bool |
395 |
socket_address_inet::operator == (const socket_address_inet& rhs) const { |
502 |
socket_address_inet::operator == (const socket_address_inet& rhs) const { |
396 |
return |
503 |
return |
Lines 406-411
Link Here
|
406 |
m_sockaddr.sin_port < rhs.m_sockaddr.sin_port); |
513 |
m_sockaddr.sin_port < rhs.m_sockaddr.sin_port); |
407 |
} |
514 |
} |
408 |
|
515 |
|
|
|
516 |
#ifdef RAK_USE_INET6 |
517 |
|
518 |
inline std::string |
519 |
socket_address_inet6::address_str() const { |
520 |
char buf[INET6_ADDRSTRLEN]; |
521 |
|
522 |
if (!address_c_str(buf, INET6_ADDRSTRLEN)) |
523 |
return std::string(); |
524 |
|
525 |
return std::string(buf); |
526 |
} |
527 |
|
528 |
inline bool |
529 |
socket_address_inet6::address_c_str(char* buf, socklen_t size) const { |
530 |
return inet_ntop(family(), &m_sockaddr.sin6_addr, buf, size); |
531 |
} |
532 |
|
533 |
inline bool |
534 |
socket_address_inet6::set_address_c_str(const char* a) { |
535 |
return inet_pton(AF_INET6, a, &m_sockaddr.sin6_addr); |
536 |
} |
537 |
|
538 |
inline socket_address |
539 |
socket_address_inet6::normalize_address() const { |
540 |
const uint32_t *addr32 = reinterpret_cast<const uint32_t *>(m_sockaddr.sin6_addr.s6_addr); |
541 |
if (addr32[0] == 0 && addr32[1] == 0 && addr32[2] == htonl(0xffff)) { |
542 |
socket_address addr4; |
543 |
addr4.sa_inet()->set_family(); |
544 |
addr4.sa_inet()->set_address_n(addr32[3]); |
545 |
addr4.sa_inet()->set_port_n(m_sockaddr.sin6_port); |
546 |
return addr4; |
547 |
} |
548 |
return *reinterpret_cast<const socket_address*>(this); |
549 |
} |
550 |
|
551 |
inline bool |
552 |
socket_address_inet6::operator == (const socket_address_inet6& rhs) const { |
553 |
return |
554 |
memcmp(&m_sockaddr.sin6_addr, &rhs.m_sockaddr.sin6_addr, sizeof(in6_addr)) == 0 && |
555 |
m_sockaddr.sin6_port == rhs.m_sockaddr.sin6_port; |
556 |
} |
557 |
|
558 |
inline bool |
559 |
socket_address_inet6::operator < (const socket_address_inet6& rhs) const { |
560 |
int addr_comp = memcmp(&m_sockaddr.sin6_addr, &rhs.m_sockaddr.sin6_addr, sizeof(in6_addr)); |
561 |
return |
562 |
addr_comp < 0 || |
563 |
(addr_comp == 0 || |
564 |
m_sockaddr.sin6_port < rhs.m_sockaddr.sin6_port); |
565 |
} |
566 |
|
567 |
#endif |
568 |
|
409 |
} |
569 |
} |
410 |
|
570 |
|
411 |
#endif |
571 |
#endif |