소켓 주소 구조체


소켓 프로그래밍에서 클라이언트 또는 서버의 구체적인 주소를 표현하기 위해서는 주소 체계(address family), IP 주소, 포트 번호 세가지가 지정되어 있어야 하며 이 3가지 정보를 묶어서 소켓 주소(socket address)라고 부른다. 소켓 주소를 담을 구조체 sockaddr 은 다음과 같이 정의되어 있으며 이것은 2 바이트의 address family와 14 바이트의 주소(IP 주소 + 포트번호)로 구성되어 있다.

struct sockaddr {
          u_short    sa_family;     // address family
          char    sa_data[14];     // IP address + Port number
};

위에서 u_short는 unsigned short(2 byte)를 나타내는데 이러한 타입 정의는 types.h 헤더 파일에 들어있다. 그런데 위에 정의된 sockaddr 소켓 주소 구조체에는 IP 주소와 포트번호를 구분하여 쓰거나 읽기가 불편하므로 인터넷 프로그래밍에서는 sockaddr 구조체를 사용하는 대신 4바이트의 IP 주소와 2바이트의 포트번호를 구분하여 액세스 할 수 있는 인터넷 전용 소켓 주소 구조체 sockaddr_in 을 사용한다. 

아래에 sockaddr_in 구조체의 정의를 나타냈는데 sockaddr_in에서는 다시 32비트의 IP 주소를 저장하기 위한 구조체 in_addr를 사용하고 있다.

struct  in_addr {
          u_long  s_addr;     // 32비트 IP 주소를 저장 할 구조체
};

struct sockaddr_in {
          short     sin_family;               // 주소 체계
          u_short  sin_port;                 // 16 비트 포트 번호
          struct     in_addr  sin_addr;   // 32 비트 IP 주소
          char       sin_zero[8];          // 전체 크기를 16 비트로 맞추기 위한 dummy
};

위에서 sockaddr_in은 sockaddr과의 호환성을 위하여 8바이트의 빈칸 sin_zero[8]을 사용하여 sockaddr_in 구조체의 전체 크기를 16바이트로 맞춘 것을 알 수 있다. sockaddr_in, in_addr 등의 인터넷 관련 구조체는 in.h 헤더 파일에 정의되어 있다. sockaddr_in 에서 주소 체계 sin_family 로 선택할 수 있는 대표적인 것은 다음과 같으며 인터넷 주소 체계를 사용하려면 AF_INET을 선택하면 된다.

sin_family  :  AF_INET  (인터넷 주소 체계)
                     AF_UNIX  (유닉스 파일 주소 체계)
                     AF_NS  (XEROX 주소 체계)

AF는 address family(주소 체계)를 나타내는데, socket()으로 소켓을 개설할 때 프로토콜을 PF_INET으로 지정한 소켓에 대해서는 주소 체계로 AF_INET 만을 사용할 수 있다. 한편 이 두 상수 PF_INET과 AF_INET의 값은 모두 2로 같으며 어떤 프로그램에서는 편의상 이 두 상수 값을 혼용하기도 한다. 

소켓 주소는 응용프로그램이 자신의 소켓 주소(local address)를 표현하는데에도 사용되며 상대방 프로세스의 소켓주소(socket address)를 표현할 때도 사용된다는 것을 주의해야 한다.