Clolent

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 보다 편하게 사용가능 ! 





댓글 로드 중…

블로그 정보

Clolent - 커피물조절달인

최근에 게시된 글