Socket 주소 구조는?

SUBJECT:   Socket 주소 구조는?

Description :

    ########   소켓 주소  구조    ##########

  많은 BSD network 시스템 호출은 독립변수로서 소켓주소 구조의 지시자를 
  필요로 한다.  이 구조의 정의는 에 있다.

       struct sockaddr {
           u_short  sa_family;    /* address family: AF_XXX value */
           char     sa_data[14];  /* up to 14 bytes of protocol-specific address */  

 1 Internet family(가족)에 대하여 다음구조 에 
   정의되어 있다.

       struct in_addr {
           u_long   s_addr        /* 32-bit netid/hostid */
       };

       struct sockaddr_in {
           short           sin_family;   /* AF_INET */
           u_short         sin_port;     /* 16-bit port number */
           struct in_addr  sin_addr;     /* 32-bit netid/hostid */
           char            sin_zero[8];  /* unused, padding to 16 bytes */
       };

     ♨ 에 정의된 무부호 데이타 형
       --------------------------------------------
         C Data Type        4.3 BSD    System V
       --------------------------------------------
         unsigned char      u_char     unchar
         unsigned short     u_short    ushort
         unsigned int       u_int      uint
         unsigned long      u_long     ulong
       --------------------------------------------

 2 Xerox NS 가족에 대하여 다음과 같은 구조 에 정의되어 있다.

       union ns_host {
           u_char       c_host[6]     /* hostid addr as six bytes  */
           u_short      s_host[3]     /* hostid addr as three 16-bit shorts */
       }

       union ns_net {
           u_char       c_net[4]      /* netid  as four bytes  */
           u_short      s_net[2]      /* netid  as two 16-bit shorts */
       }

       struct ns_addr {
           union ns_net  x_net;        /* 4-byte netid */
           union ns_host x_host;       /* 6-byte hostid */
           u_short       x_port;       /* 2-byte port (XNS "socket") */
       };

       struct sockaddr_ns {
           u_short         sns_family;   /* AF_NS */
           struct ns_addr  sns_addr;     /* the 12-byte XNS address */
           char            sns_zeor[2];  /* unused */
       };
       #define sns_port  sns_addr.x_port

 3 유닉스 범주에 대하여 다음구조는 에 정의되어 있다. 

       struct sockaddr_un {
            short        sun_family;     /* AF_UNIX */
            char         sun_path[108];  /* pathname */
       };





 ☆ XX_family 구성원인 이들 주소 구조중 처음 두 바이트의 선언이 일치하지 않는다.
    Internet과 유닉스범주 구성원들은 짧은 정수로 선언되어 있는 반면, 
    XNS 구성원과 일반적인 sockaddr구성원은 무부호 짧은 정수이다. 
    다행스럽게도 AF_XXX 상수들에 저장되는 값들은 모두 1과 20사이이므로 
    데이타 형에 있어서 이러한 불일치는 문제가 되지 않는다.  


        ◆  Internet, XNS, Unix 가족에 대한 소켓주소 구조  ◆

      struct sockaddr_in         struct sockaddr_ns     struct sockaddr_un
      ------------------         ------------------     -------------------
      |    family      |         |     family     |     |     family      | 
      ------------------         ------------------     -------------------
      |   2-byte port  |         |  4-byte net ID |     |                 |
      ------------------         ------------------     |                 |
      |    4-byte      |         |                |     |                 |
      | net ID,host ID |         |                |     |     pathname    |
      ------------------         | 6-byte host ID |     |(up to 108 bytes)|
      |                |         |                |     |                 |
      |                |         |                |     |                 |
      |    (unused)    |         ------------------     |                 |
      |                |         |  2-byte port   |     |                 |
      |                |         ------------------     |                 |
      |                |         |    (unused)    |     |                 |
      ------------------         ------------------     -------------------
      
 ☞ Address family 는 에 정의되있음
   
     #define AF_UNIX     1      /* local to host (pipes, portals) */
     #define AF_INET     2      /* internetwork: UDP, TCP, etc. */
     #define AF_NS       6      /* XEROX NS protocols */

 ☞ 소켓 접속의 설계자는 소켓 주소 구조를 정의하기 위해서 C의 union을 
    사용할 수도 있다. 그 선언은 다음과 같이 작성할 수 있다.

     struct sock_addr {
        short   sa_family;       /*  AF_XXX value */ 
        union {
           struct sockaddr_in sa_in;   /* Internet address */
           struct sockaddr_ns sa_ns;   /* XNS address */
           struct sockaddr_un sa_un;   /* Unix address */
        } sa_val;
      };

     이러한 접근방법의 문제는 union의 크기가 유닉스 범주 주소 크기인 가장 큰 
     구성원의 크기에 의하여 결정된다는 것이다. 이는 Internet과 XNS주소가 각각 
     8바이트와 14바이트만 필요로 할지라도 모든 sock_addr 구조의 크기를 
     110바이트가 되게 한다 (이 경우에 Internet sockadd_in의 마지막 부분에 
     0으로 구성된 8바이트와 XNS sockaddr_ns의 마지막 부분에 0으로 구성된 
     2바이트가 필요없다는 사실에 주의)

Revision History

작성일자 : 96.10.11
작성자 : 이진수

수정일자 :
수정자 :