Some info on sockets. I keep looking for these, so I put them here.
Note: Stuff like family is AF_INET for IPv4 and AF_INET6 for IPv6.
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
struct ifaddrs {
struct ifaddrs *ifa_next; // Next item in list
char *ifa_name; // Name of interface
unsigned int ifa_flags; // Flags from SIOCGIFFLAGS
struct sockaddr *ifa_addr; // Address of interface
struct sockaddr *ifa_netmask; // Netmask of interface
union {
struct sockaddr *ifu_broadaddr; // Broadcast address of interface
struct sockaddr *ifu_dstaddr; // Point-to-point destination address
} ifa_ifu;
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void *ifa_data; // Address-specific data
};
struct sockaddr {
sa_family_t sa_family;
char sa_data[]; // Used to be 14 bytes
}
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
struct in_addr {
in_addr_t s_addr; // 32-bit unsigned int
};
struct sockaddr_in6 {
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
struct in6_addr {
unsigned char s6_addr[16];
};
An IPv4 address is an 32-bit unsigned int.
An IPv6 address is an array of 16 8-bit unsigned ints.
An IPv4 address in an above struct is network byte order. So that's high to low or big endian.