소켓 프로그래밍 sockaddr_in, in_addr 구조체

조회수 654회
int main(int argc, char* argv[])
{

    struct sockaddr_in addr1, addr2;
    char* str_ptr;
    char str_arr[20];

    addr1.sin_addr.s_addr = htonl(0x10203040);
}

여기서 s_addrin_addr 구조체에 선언이 된 변수입니다.

궁금한 점은 in_addr 구조체가 선언도 안 되었는데 왜 오류가 아닌 것 인가요?

(책 코드 일부를 발췌했습니다.)

헤더파일은 stdio.h, string.h, arpa/inet.h를 선언 했습니다.

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    https://man7.org/linux/man-pages/man7/ip.7.html 을 확인해 보시면 다음과 같이 sockaddr_in이 정의되어 있습니다.

    struct sockaddr_in {
        sa_family_t    sin_family; /* address family: AF_INET */
        in_port_t      sin_port;   /* port in network byte order */
        struct in_addr sin_addr;   /* internet address */
    };
    
    /* Internet address */
    struct in_addr {
        uint32_t       s_addr;     /* address in network byte order */
    };
    

    실제로 linux의 /usr/include/netinet/in.h 헤더를 보면 다음과 같이 정의되어 있습니다.

    typedef uint32_t in_addr_t;
    struct in_addr
      {
        in_addr_t s_addr;
      };
    
    struct sockaddr_in
      {
        __SOCKADDR_COMMON (sin_);
        in_port_t sin_port;                 /* Port number.  */
        struct in_addr sin_addr;            /* Internet address.  */
    
        /* Pad to size of `struct sockaddr'.  */
        unsigned char sin_zero[sizeof (struct sockaddr)
                               - __SOCKADDR_COMMON_SIZE
                               - sizeof (in_port_t)
                               - sizeof (struct in_addr)];
      };
    

    위 코드들으 보시면 sockaddr_in이란 구조체는 멤버 변수 sin_addr을 갖고 있습니다. 이 변수 sin_addrin_addr구조체 이기 때문에 s_addr 멤버 변수를 갖습니다.

    그러니 addr1sin_addr을 갖고 있고, 이 sin_addrs_addr을 갖기 때문에 연쇄적으로 addr1.sin_addr.s_addr으로 접근할 수 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)