소켓 프로그래밍 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_addr
은 in_addr
구조체에 선언이 된 변수입니다.
궁금한 점은 in_addr
구조체가 선언도 안 되었는데 왜 오류가 아닌 것 인가요?
(책 코드 일부를 발췌했습니다.)
헤더파일은 stdio.h, string.h, arpa/inet.h를 선언 했습니다.
1 답변
-
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_addr
은in_addr
구조체 이기 때문에s_addr
멤버 변수를 갖습니다.그러니
addr1
은sin_addr
을 갖고 있고, 이sin_addr
은s_addr
을 갖기 때문에 연쇄적으로addr1.sin_addr.s_addr
으로 접근할 수 있습니다.
댓글 입력