Fundamentals/SOCKET

[SOCKET] sockaddr 구조체 - sockaddr

grayroom 2020. 3. 6. 15:19

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