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.