Socket Programming을 할 때 매번 사용하면서도 항상 헷갈려서 정리를 해 보았음.

Structure Meaning
in_addr ip4
in6_addr ip6
sockaddr family + dummy[14]
sockaddr_in family + ip4 + port
sockaddr_in6 family + ip6 + port
// IPv4 주소(4byte == 32bit) (in.h)
struct in_addr {
    uint32_t s_addr;
};

// IPv6 주소(16byte == 128bit) (in.h)
struct in6_addr {
  union {
    uint8_t __u6_addr8[16];
    uint16_t __u6_addr16[8];
    uint32_t __u6_addr32[4];
  } __in6_u;
#define s6_addr __in6_u.__u6_addr8
#define s6_addr16 __in6_u.__u6_addr16
#define s6_addr32 __in6_u.__u6_addr32
};

// sockaddr...로 시작하는 구조체의 Parent 구조체 (socket.h)
struct sockaddr {
  unsigned short int sa_family; // AF_INET은 IPv4, AF_NET6는 IPv6
  char sa_data[14];
};

// IPv4 주소 및 포트 정보 (in.h)
struct sockaddr_in {
  unsigned short int sin_family;
  uint16_t sin_port;
  struct in_addr sin_addr;
  unsigned char sin_zero[8];
};

// IPv6 주소 및 포트 정보 (in.h)
struct sockaddr_in6 {
  unsigned short int sin6_family;
  uint16_t sin6_port;
  uint32_t sin6_flowinfo;
  struct in6_addr sin6_addr;
  uint32_t sin6_scope_id;
};