ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소켓 구조체
    Socket통신/Socket통신 2022. 4. 9. 13:27

    소켓을 사용하기 위해 필수적으로 사용되는 sockaddr 구조체와 sockaddr_in 구조체를 공부하도록 하겠다.

     

     다음은 sockaddr 구조체의 정의다.

    typedef struct sockaddr {

        u_short sa_family; // Address family.
        CHAR sa_data[14];  // Up to 14 bytes of direct address.
    } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;

    sa_family
     2바이트 크기로 주소 체계를 지정한다.
    TCP , UDP 
    프로토콜은 AF_INET(PF_INET)을 사용하게 된다.

    sa_data[14] 6바이트에 IP 주소와 포트 번호가 지정되며 나머지 8바이트는 예약되어 사용되지 않는다.
    위 구조체는 프로그램에서 IP 주소와 포트 번호를 지정하기 위해 비트연산을 수행해야 하므로 좀더 사용하기 편한 sockaddr_int 구조체를 사용할 수 있다.
     
     

     

    다음은 sockaddr_int 구조체의 정의다.


    typedef struct sockaddr_in {
     
    short   sin_family;   
        USHORT sin_port;
        IN_ADDR sin_addr;
        CHAR sin_zero[8];
    } SOCKADDR_IN, *PSOCKADDR_IN;

    로 정의되어 IP 주소와 포트 번호를 쉽게 지정하여 사용할 수 있다.
    sin_family에는 2바이트 주소 체계를 지정한다.
    sin_port에는 2바이트 정수 포트 번호를 지정한다.
    sin_addr에는 4바이트 정수 IP 주소를 지정한다.
    sin_zero[8]는 예약되어 사용되지 않는다.

     

    IN_ADDR 구조체의 정의로 IP 주소를 1,2,4 바이트 단위로 쉽게 접근할 수 있도록 제공하는 구조체다.

    typedef struct in_addr {
            union {
                    struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
                    struct { USHORT s_w1,s_w2; } S_un_w;
                    ULONG S_addr;
            } S_un;

    #define s_addr  S_un.S_addr /* can be used for most tcp & ip code */
    #define s_host  S_un.S_un_b.s_b2    // host on imp
    #define s_net   S_un.S_un_b.s_b1    // network
    #define s_imp   S_un.S_un_w.s_w2    // imp
    #define s_impno S_un.S_un_b.s_b4    // imp #
    #define s_lh    S_un.S_un_b.s_b3    // logical host
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

     

    sockaddr 구조체와 sockaddr_in 구조체를 비교한 그림

     

    댓글

Designed by Tistory.