티스토리 뷰
# 서버측 기초 소켓통신 구조
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 |