sockaddr구조체는 소켓의 주소에 대한 정보를 담는 구조체입니다. 해당 구조체를 사용해 bind(), connect(), sendto()등의 함수에 소켓의 주소에 대한 정보를 전달할 수 있는 것이죠.
sockaddr구조체의 원형
sockaddr의 원형은 socket.h에 아래와 같이 정의되어 있습니다.
/* Structure describing a generic socket address. */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
매크로 함수 __SOCKADDR_COMMON의 원형은 sockaddr.h에 아래와 같이 정의되어 있습니다.
/* This macro is used to declare the initial common members
of the data types used for socket addresses, `struct sockaddr',
`struct sockaddr_in', `struct sockaddr_un', etc. */
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
참고로, sa_family_t라는 자료형은 sockaddr.h에 아래와 같이 정의되어 있습니다.
/* POSIX.1g specifies this type name for the `sa_family' member. */
typedef unsigned short int sa_family_t;
즉 sockaddr의 원형은 아래의 표현과 같습니다. 이제 한결 알아보기 쉬운 형태가 되었군요. (short int는 short와 같은 표현입니다.)
/* Structure describing a generic socket address. */
struct sockaddr
{
unsigned short sa_family; /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
sa_family: address family와 그 길이(IPv4, IPv6)에 대한 정보를 저장합니다.
sa_data: sockaddr구조체에 세부적인 주소 정보를 저장하는 멤버입니다.
address family에는 아래와 같은 값들이 올 수 있습니다.
/* Address families. */
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_INET PF_INET
#define AF_INET6 PF_INET6
...
AF prefix와 PF prefix의 경우 동일한 값을 갖지만, address family에 값을 삽입할 때는 AF(address family) prefix를 사용하는 것이 좋습니다.
'Fundamentals > SOCKET' 카테고리의 다른 글
[SOCKET] TCP소켓의 연결과 연결종료 (0) | 2020.03.11 |
---|