티스토리 뷰

# 서버측 기초 소켓통신 구조






sockaddr_in : IPv4의 주소정보를 담기위해 정의된 구조체

 - sin_family

 · AF_INET : IPv4 프로토콜에 적용하는 주소체계

 · AF_INET6 : IPv6 프로토콜에 적용하는 주소체계

 · AF_LOCAL : 로컬통신을 위한 유닉스 프로토콜 주소체계


 - sin_port

 · 16비트 PORT번호를 저장


 - sin_addr

 · 32비트 IP주소정보를 저장


 - sin_zero

 · 구조체 sockaddr_in의 크기를 구조체 sockaddr과 일치시키기 위한 의미 없는 멤버. 단 반드시 0으로 채워야한다.



네트워크 바이트 순서와 인터넷 주소 변환

 - CPU가 데이터를 메모리에 저장하는 방식을 '호스트 바이트 순서'라 하는데 여기엔 두가지가 있다. 

리틀엔디안 / 빅엔디안 이 그것이다.

리틀엔디안 : 인텔계열. 대부분의 CPU

빅엔디안 : 네트워크 바이트 순서(Network Byte Order)


따라서 모든 컴퓨터는 수신된 데이터가 네트워크 바이트 순서로 정렬되어 있음을 인식해야하고, 

리틀엔디안 시스템에서는 데이터를 전송하기에 앞서 빅엔디안의 정렬방식으로 

데이터를 재 정렬해주어야 한다.


따라서 sockaddr_in 구조체 변수에 값을 채우기 전에 네트워크 바이트 순서로 변환해서 저장해야한다.

이를 도와주는 함수는 다음과 같다.


unsigned short htons(unsigned short);    // host to network short

unsigned short ntohs(unsigned short);    // network to host short

unsigned long htonl(unsigned long);      // host to network long

unsigned long ntohl(unsigned long);      // network to host long


htons에서의 h는 호스트(host) 바이트 순서를 의미한다. n은 네트워크(network) 바이트 순서를 의미한다.

s는 short, l은 long을 의미한다. 참고로 리눅스에서 long은 4바이트다.

'NETWORK' 카테고리의 다른 글

4) TCP 서버 함수호출 순서 및 함수분석  (0) 2018.04.24
3) TCP / UDP에 대한 이해  (0) 2018.04.24
2) 소켓멤버분석 : sockaddr_in구조체  (0) 2018.04.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함