IPv4 기반 주소 표현을 위한 구조체 [ sockaddr_in ]
struct sockaddr_in
{
sa_family_t sin_family ; // 주소 체계
uint16_t sin_port ; // 16비트 TCP/UDP PORT 번호
struct in_addr sin_addr ; // 32비트 IP 주소
char sin_zero[8] ; // 사용 되지않음
}
struct in_addr
{
in_addr s_addr // 32비트 IPv4 인터넷 주소
}
멤버 설명
sin_family
AF_INET : IPv4 인터넷 프로토콜에 적용하는 주소체계 얘만 외워도된다
AF_INET6 : IPv6 인터넷 프로토콜에 적용하는 주소체계
AF_LOCAL : 로컬 통신을 위한 유닉스 프로토콜의 주소체계
sin_port
16비트 PORT 번호를 " 네트워크 바이트 순서 " 로 저장한다.'
sin_addr
32비트 IP 주소를 " 네트워크 바이트 순서 " 로 저장한다.
sin_zero
특별한 의미를 지니지않는 멤버로 구조체 sockaddr_in의 크기를 위해 삽입된 멤버로 반드시 0으로 채워져야 한다. memset으로 굳이 초기화 시켜주는 이유 !
아래 초기화는 기본적으로 암기를 하자
struct sockaddr_in serv_addr ;
bind ( serv_addr, ( struct sockaddr* ) &serv_addr, sizeof( serv_addr ))
네트워크 바이트 순서와 인터넷 주소의 변환
- 빅 엔디안 ( Big endian ) 그리고 리틀 엔디안 ( Little endian )
그림을 보면 좀더 이해가 쉽다. 아마도
정의를 보자면
빅 엔디안
상위 바이트의 값을 작은 번지수에 저장하는 방식
리틀 엔디안
상위 바이트의 값을 큰 번지수에 저장하는 방식
사실 나도 이렇게만 써봣자 뭔소린지 모르겠다
이 그림이 설명을 정말 잘해주는 그림이긴한데....
표로 정리해보자
- 빅 엔디안
0x20번지 |
0x21번지 |
0x22번지 |
0x23번지 |
0x12 |
0x34 |
0x56 |
0x78 |
- 리틀 엔디안
0x20번지 |
0x21번지 |
0x22번지 |
0x23번지 |
0x78 |
0x56 |
0x34 |
0x12 |
^오^ 그렇다고한다.
※ 네트워크 바이트 순서는 빅 엔디안으로 통일 되었다.
역시 빅
바이트 순서의 변환
unsigned short htons ( unsigned short )
unsigned short ntohs ( unsigned short )
unsigned long htonl ( unsigned short )
unsigned long ntohl ( unsigned short )
h : 호스트
n : 네트워크
s : short 형 데이터
l : long 형 데이터
htons : short 형 호스트 바이트 순서에 데이터를 네트워크 바이트 순서로 변환해라
매우 직관적이다.
Q : ^오^ 내 시스템은 빅 엔디안으로 동작함 그럼 변환안하고 넘겨도 되겠네요
A : 되긴하는데, 그 프로그램 리틀엔디안으로 하는 곳에선 못돌리잖아 그럼
Q : 과제용이라서 괜찮아요
A : 용기있는 발언이야
Q : 내가 보내는 모든 데이터를 그럼 네트워크 바이트 순서로 모두 변환해야하나요
A : 아니 자동으로 해줍니당
Q : 좋네요
문자열 정보를 네트워크 바이트 순서의 정수로 변환
자 우린 IP를 어떻게 쓰는가
123.123.123.123 이런식으로 쓰는데 이를 하나의 정수로 변환해서
전달을 해야한다. 어떻하는가 ??
일단 종이와 펜을 준비한다
다행히도 변환을 해주는 함수가 준비되어 있다.
int_addr_t inet_addr ( const char* string )
성공시 빅 엔디안으로 변환된 32비트 정수값
실패시 INADDR_NONE 이라는 값을 반환
주의 ! 1바이트당 표현가능한 최대 정수는 255임을 기억하자
EX ) 123.123.123.256 을 인자로 넘길경우 INADDR_NONE 이 반환 !
비슷한듯 다른 친척 inet_aton
int inet_aton ( const char* string, struct in_addr* addr )
string : 변환할 ip 를 담고있는 문자열 주소값
addr : 변환된 정보를 저장할 in_addr 구조체 변수의 주소값
이녀석은 인자로 in_addr 구조체 변수의 주소값을 전달함으로서
자동으로 저장해주기에 inet_addr 보다 편하게 사용가능 !