How-To use socket addresses in a portable way

POSIX networking APIs define struct sockaddr, which provides a semi-portable way for dealing with socket addresses. The structure is only semi-portable, because its size is platform- and feature dependent, and dealing with those differences can make code rather verbose.

With the liberate::net::socket_address class, this library provides a means for easily converting to and from struct sockaddr, with bounds checks on the underlying data structure.

The class is hashable and comparable, and therefore can easily be used as keys in C++ containers.

Convert from struct sockaddr
1#include <liberate/net/socket_address.h>
2
3struct sockaddr input;
4// Initialize with system APIs in whichever way is appropriate
5
6liberate::net::socket_address addr1{&input, sizeof(input)};
7liberate::net::socket_address addr2{&input, sizeof(input)};
8
9assert(addr1 == addr2);

You can now use such socket_address instances with system APIs by using its accessor functions.

Use where struct sockaddr is expected
1int ret = ::bind(fd,
2  reinterpret_cast<struct sockaddr const *>(addr.buffer()),
3  addr.bufsize());